# JCodec **Repository Path**: owlstudio/JCodec ## Basic Information - **Project Name**: JCodec - **Description**: Java常用加密解密操作合集 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 5 - **Created**: 2024-02-04 - **Last Updated**: 2024-02-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 第一部分 简介 `JCodec`包含了常用的编码、加解密的`JAVA`实现。 # 第二部分 开始使用 使用`JCodec`可以直接下载源代码编译或者下载已经编译的`jar`文件,如果您是使用`maven`来构建项目,也可以直接在`pom.xml`中添加`JCodec`的坐标: [![Maven central](https://maven-badges.herokuapp.com/maven-central/com.jianggujin/JCodec/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.jianggujin/JCodec) ```xml com.jianggujin JCodec 最新版本 ``` 最新的版本可以从[Maven仓库](http://mvnrepository.com/artifact/com.jianggujin/JCodec)或者[码云](https://gitee.com/jianggujin)获取。 ## 2.1 Base64 ```java package com.jianggujin.codec.test; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import org.junit.Test; import com.jianggujin.codec.JBase64; import com.jianggujin.codec.JBase64.JDecoder; import com.jianggujin.codec.JBase64.JEncoder; public class Base64Test { String str = "jianggujin"; File file = new File(getClass().getSimpleName() + ".dat"); @Test public void test() throws IOException { JEncoder encoder = JBase64.getEncoder(); JDecoder decoder = JBase64.getDecoder(); System.out.println("原串:" + str); String encode = encoder.encodeToString(str.getBytes(), "UTF-8"); System.out.println("编码:" + encode); System.out.println("解码:" + new String(decoder.decode(encode, "UTF-8"))); System.out.print("输出流编码:" + file.getAbsolutePath()); OutputStream out = encoder.wrap(new FileOutputStream(file)); out.write(str.getBytes()); out.flush(); out.close(); System.out.println(); System.out.print("输入流解码:"); InputStream in = decoder.wrap(new FileInputStream(file)); byte[] buffer = new byte[1024]; int len = in.read(buffer); System.out.println(new String(buffer, 0, len)); } } ``` ## 2.2 Caesar(凯撒加密) ```java package com.jianggujin.codec.test; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import org.junit.Test; import com.jianggujin.codec.JCaesar; public class CaesarTest { String str = "jianggujin"; File file = new File(getClass().getSimpleName() + ".dat"); int k = 10; @Test public void test() throws IOException { System.out.println("原串:" + str + ", 偏移:" + k); String encrypt = JCaesar.encrypt(str, k); System.out.println("加密:" + encrypt); System.out.println("解密:" + JCaesar.decrypt(encrypt, k)); System.out.print("输出流加密:" + file.getAbsolutePath()); OutputStream out = JCaesar.wrap(new FileOutputStream(file), k); out.write(str.getBytes()); out.flush(); System.out.println(); System.out.print("输入流解密:"); InputStream in = JCaesar.wrap(new FileInputStream(file), k); byte[] buffer = new byte[1024]; int len = in.read(buffer); System.out.println(new String(buffer, 0, len)); } } ``` ## 2.3 CRC32(循环冗余校验) ```java package com.jianggujin.codec.test; import java.io.IOException; import org.junit.Test; import com.jianggujin.codec.JCRC32; public class CRC32Test { String str = "jianggujin"; @Test public void test() throws IOException { System.out.println("原串:" + str); System.out.println("CRC32:" + JCRC32.encode(str.getBytes())); } } ``` ## 2.4 MessageDigest(信息摘要算法) ```java package com.jianggujin.codec.test; import org.junit.Test; import com.jianggujin.codec.JHex; import com.jianggujin.codec.JMessageDigest; import com.jianggujin.codec.JMessageDigest.JMessageDigestAlgorithm; public class MessageDigestTest { String str = "jianggujin"; @Test public void test() throws Exception { System.out.println("原串:" + str); for (JMessageDigestAlgorithm algorithm : JMessageDigestAlgorithm.values()) { System.out.println("-----------------------------------------"); System.out.println("算法:" + algorithm.getName()); byte[] result = JMessageDigest.encrypt(str.getBytes(), algorithm.getName()); System.out.println("结果:" + JHex.encodeString(result)); } } } ``` ## 2.5 Mac(消息认证码 Message Authentication Code) ```java package com.jianggujin.codec.test; import org.junit.Test; import com.jianggujin.codec.JBase64; import com.jianggujin.codec.JBase64.JEncoder; import com.jianggujin.codec.JHex; import com.jianggujin.codec.JMac; import com.jianggujin.codec.JMac.JMacAlgorithm; public class MacTest { String str = "jianggujin"; @Test public void test() throws Exception { System.out.println("原串:" + str); JEncoder encoder = JBase64.getEncoder(); for (JMacAlgorithm algorithm : JMacAlgorithm.values()) { System.out.println("-----------------------------------------"); System.out.println("算法:" + algorithm); byte[] key = JMac.initEncodedKey(algorithm); System.out.println("密钥:" + encoder.encodeToString(key, "UTF-8")); byte[] result = JMac.encrypt(str.getBytes(), key, algorithm); System.out.println("结果:" + JHex.encodeString(result)); } } } ``` ## 2.6 Symmetrical(对称加密) ```java package com.jianggujin.codec.test; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import org.junit.Test; import com.jianggujin.codec.JBase64; import com.jianggujin.codec.JBase64.JEncoder; import com.jianggujin.codec.JSymmetrical; import com.jianggujin.codec.JSymmetrical.JSymmetricalAlgorithm; public class SymmetricalTest { String str = "jianggujin"; File file = new File(getClass().getSimpleName() + ".dat"); @Test public void test() throws Exception { System.out.println("原串:" + str); JEncoder encoder = JBase64.getEncoder(); for (JSymmetricalAlgorithm algorithm : JSymmetricalAlgorithm.values()) { System.out.println("-----------------------------------------"); System.out.println("算法:" + algorithm); byte[] key = JSymmetrical.initEncodedKey(algorithm); System.out.println("密钥:" + encoder.encodeToString(key, "UTF-8")); byte[] encrypt = JSymmetrical.encrypt(str.getBytes(), key, algorithm); System.out.println("加密:" + encoder.encodeToString(encrypt, "UTF-8")); System.out.println("解密:" + new String(JSymmetrical.decrypt(encrypt, key, algorithm))); System.out.print("输出流加密:" + file.getAbsolutePath()); OutputStream out = JSymmetrical.wrap(new FileOutputStream(file), key, algorithm); out.write(str.getBytes()); out.flush(); out.close(); System.out.println(); System.out.print("输入流解密:"); InputStream in = JSymmetrical.wrap(new FileInputStream(file), key, algorithm); byte[] buffer = new byte[1024]; int len = in.read(buffer); System.out.println(new String(buffer, 0, len)); } } } ``` ## 2.7 TripleDES(三重数据加密算法) ```java package com.jianggujin.codec.test; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import org.junit.Test; import com.jianggujin.codec.JBase64; import com.jianggujin.codec.JBase64.JEncoder; import com.jianggujin.codec.JTripleDES; import com.jianggujin.codec.JTripleDES.JTripleAlgorithm; import com.jianggujin.codec.JTripleDES.JPadding; import com.jianggujin.codec.JTripleDES.JWorkingMode; public class TripleDESTest { String str = "jianggujin111111"; File file = new File(getClass().getSimpleName() + ".dat"); @Test public void test() throws Exception { System.out.println("原串:" + str); JEncoder encoder = JBase64.getEncoder(); for (JTripleAlgorithm algorithm : JTripleAlgorithm.values()) { System.out.println("算法:" + algorithm); byte[] key = JTripleDES.initEncodedKey(algorithm); System.out.println("密钥:" + encoder.encodeToString(key, "UTF-8")); for (JWorkingMode workingMode : JWorkingMode.values()) { for (JPadding padding : JPadding.values()) { System.out.println("-----------------------------------------"); System.out.println(algorithm + "/" + workingMode + "/" + padding); byte[] encrypt = JTripleDES.encrypt(str.getBytes(), key, algorithm, workingMode, padding); System.out.println("加密:" + encoder.encodeToString(encrypt, "UTF-8")); System.out .println("解密:" + new String(JTripleDES.decrypt(encrypt, key, algorithm, workingMode, padding))); System.out.print("输出流加密:" + file.getAbsolutePath()); OutputStream out = JTripleDES.wrap(new FileOutputStream(file), key, algorithm, workingMode, padding); out.write(str.getBytes()); out.flush(); out.close(); System.out.println(); System.out.print("输入流解密:"); InputStream in = JTripleDES.wrap(new FileInputStream(file), key, algorithm, workingMode, padding); byte[] buffer = new byte[1024]; int len = in.read(buffer); System.out.println(new String(buffer, 0, len)); } } } } } ``` ## 2.8 DH(Diffie-Hellman算法) ```java package com.jianggujin.codec.test; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.security.KeyPair; import org.junit.Test; import com.jianggujin.codec.JBase64; import com.jianggujin.codec.JBase64.JEncoder; import com.jianggujin.codec.JDH; import com.jianggujin.codec.JDH.JDHSymmetricalAlgorithm; public class DHTest { String str = "jianggujin"; File file = new File(getClass().getSimpleName() + ".dat"); @Test public void test() throws Exception { System.out.println("原串:" + str); JEncoder encoder = JBase64.getEncoder(); KeyPair keyPairA = JDH.initPartyAKey(); byte[] keyPairAPrivate = keyPairA.getPrivate().getEncoded(); byte[] keyPairAPublic = keyPairA.getPublic().getEncoded(); System.out.println("甲方私钥:" + encoder.encodeToString(keyPairAPrivate, "UTF-8")); System.out.println("甲方公钥:" + encoder.encodeToString(keyPairAPublic, "UTF-8")); KeyPair keyPairB = JDH.initPartyBKey(keyPairAPublic); byte[] keyPairBPrivate = keyPairB.getPrivate().getEncoded(); byte[] keyPairBPublic = keyPairB.getPublic().getEncoded(); System.out.println("乙方私钥:" + encoder.encodeToString(keyPairBPrivate, "UTF-8")); System.out.println("乙方公钥:" + encoder.encodeToString(keyPairBPublic, "UTF-8")); for (JDHSymmetricalAlgorithm algorithm : JDHSymmetricalAlgorithm.values()) { System.out.println("-----------------------------------------"); System.out.println("对称算法:" + algorithm); byte[] encrypt = JDH.encrypt(str.getBytes(), keyPairAPrivate, keyPairBPublic, algorithm); System.out.println("加密:" + encoder.encodeToString(encrypt, "UTF-8")); System.out.println("解密:" + new String(JDH.decrypt(encrypt, keyPairBPrivate, keyPairAPublic, algorithm))); System.out.print("输出流加密:" + file.getAbsolutePath()); OutputStream out = JDH.wrap(new FileOutputStream(file), keyPairAPrivate, keyPairBPublic, algorithm); out.write(str.getBytes()); out.flush(); out.close(); System.out.println(); System.out.print("输入流解密:"); InputStream in = JDH.wrap(new FileInputStream(file), keyPairBPrivate, keyPairAPublic, algorithm); byte[] buffer = new byte[1024]; int len = in.read(buffer); System.out.println(new String(buffer, 0, len)); } } } ``` ## 2.9 DSA(Digital Signature Algorithm) ```java package com.jianggujin.codec.test; import java.io.File; import java.security.KeyPair; import org.junit.Test; import com.jianggujin.codec.JBase64; import com.jianggujin.codec.JBase64.JEncoder; import com.jianggujin.codec.JDSA; import com.jianggujin.codec.JDSA.JDSASignatureAlgorithm; import com.jianggujin.codec.util.JCodecUtils; public class DSATest { String str = "jianggujin"; File file = new File(getClass().getSimpleName() + ".dat"); @Test public void test() throws Exception { System.out.println("原串:" + str); JEncoder encoder = JBase64.getEncoder(); KeyPair keyPair = JDSA.initKey(); byte[] keyPairPrivate = keyPair.getPrivate().getEncoded(); byte[] keyPairPublic = keyPair.getPublic().getEncoded(); System.out.println("私钥:" + encoder.encodeToString(keyPairPrivate, "UTF-8")); System.out.println("公钥:" + encoder.encodeToString(keyPairPublic, "UTF-8")); for (JDSASignatureAlgorithm algorithm : JDSASignatureAlgorithm.values()) { System.out.println("-----------------------------------------"); System.out.println("签名算法:" + algorithm); byte[] signed = JDSA.sign(str.getBytes(), keyPairPrivate, algorithm); System.out.println("签名:" + encoder.encodeToString(signed, "UTF-8")); JCodecUtils.getPublicKey(keyPairPublic, "DSA"); boolean verify = JDSA.verify(str.getBytes(), signed, keyPairPublic, algorithm); System.out.println("验签:" + verify); } } } ``` ## 2.10 PBE(基于密码加密 Password-based encryption) ```java package com.jianggujin.codec.test; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import org.junit.Test; import com.jianggujin.codec.JBase64; import com.jianggujin.codec.JBase64.JEncoder; import com.jianggujin.codec.JPBE; import com.jianggujin.codec.JPBE.JPBEAlgorithm; public class PBETest { String str = "jianggujin"; String password = "12345678"; File file = new File(getClass().getSimpleName() + ".dat"); @Test public void test() throws Exception { System.out.println("原串:" + str); JEncoder encoder = JBase64.getEncoder(); byte[] salt = JPBE.initSalt(); System.out.println("盐:" + encoder.encodeToString(salt, "UTF-8")); System.out.println("密码:" + password); for (JPBEAlgorithm algorithm : JPBEAlgorithm.values()) { System.out.println("-----------------------------------------"); System.out.println("算法:" + algorithm); byte[] encrypt = JPBE.encrypt(str.getBytes(), password.toCharArray(), salt, algorithm); System.out.println("加密:" + encoder.encodeToString(encrypt, "UTF-8")); System.out.println("解密:" + new String(JPBE.decrypt(encrypt, password.toCharArray(), salt, algorithm))); System.out.print("输出流加密:" + file.getAbsolutePath()); OutputStream out = JPBE.wrap(new FileOutputStream(file), password.toCharArray(), salt, algorithm); out.write(str.getBytes()); out.flush(); out.close(); System.out.println(); System.out.print("输入流解密:"); InputStream in = JPBE.wrap(new FileInputStream(file), password.toCharArray(), salt, algorithm); byte[] buffer = new byte[1024]; int len = in.read(buffer); System.out.println(new String(buffer, 0, len)); } } } ``` ## 2.11 RSA ```java package com.jianggujin.codec.test; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.security.KeyPair; import org.junit.Test; import com.jianggujin.codec.JBase64; import com.jianggujin.codec.JBase64.JEncoder; import com.jianggujin.codec.JRSA; import com.jianggujin.codec.JRSA.JRSASignatureAlgorithm; public class RSATest { String str = "jianggujin"; File file = new File(getClass().getSimpleName() + ".dat"); @Test public void test() throws Exception { System.out.println("原串:" + str); JEncoder encoder = JBase64.getEncoder(); KeyPair keyPair = JRSA.initKey(); byte[] privateKey = keyPair.getPrivate().getEncoded(); byte[] publicKey = keyPair.getPublic().getEncoded(); System.out.println("私钥:" + encoder.encodeToString(privateKey, "UTF-8")); System.out.println("公钥:" + encoder.encodeToString(publicKey, "UTF-8")); for (JRSASignatureAlgorithm algorithm : JRSASignatureAlgorithm.values()) { System.out.println("-----------------------------------------"); System.out.println("签名算法:" + algorithm); byte[] signed = JRSA.sign(str.getBytes(), privateKey, algorithm); System.out.println("签名:" + encoder.encodeToString(signed, "UTF-8")); boolean verify = JRSA.verify(str.getBytes(), signed, publicKey, algorithm); System.out.println("验签:" + verify); } byte[] encrypt = JRSA.encryptByPrivateKey(str.getBytes(), privateKey); System.out.println("私钥加密:" + encoder.encodeToString(encrypt, "UTF-8")); System.out.println("公钥解密:" + new String(JRSA.decryptByPublicKey(encrypt, publicKey))); System.out.print("输出流私钥加密:" + file.getAbsolutePath()); OutputStream out = JRSA.wrapByPrivateKey(new FileOutputStream(file), privateKey); out.write(str.getBytes()); out.flush(); out.close(); System.out.println(); System.out.print("输入流公钥解密:"); InputStream in = JRSA.wrapByPublicKey(new FileInputStream(file), publicKey); byte[] buffer = new byte[1024]; int len = in.read(buffer); System.out.println(new String(buffer, 0, len)); encrypt = JRSA.encryptByPublicKey(str.getBytes(), publicKey); System.out.println("公钥加密:" + encoder.encodeToString(encrypt, "UTF-8")); System.out.println("私钥解密:" + new String(JRSA.decryptByPrivateKey(encrypt, privateKey))); System.out.print("输出流公钥加密:" + file.getAbsolutePath()); out = JRSA.wrapByPublicKey(new FileOutputStream(file), publicKey); out.write(str.getBytes()); out.flush(); out.close(); System.out.println(); System.out.print("输入流私钥解密:"); in = JRSA.wrapByPrivateKey(new FileInputStream(file), privateKey); len = in.read(buffer); System.out.println(new String(buffer, 0, len)); } } ``` ## 2.12 Certificate(数字证书) ```java package com.jianggujin.codec.test; import java.io.FileOutputStream; import java.security.KeyStore; import java.security.PrivateKey; import java.security.PublicKey; import java.security.cert.X509Certificate; import java.text.SimpleDateFormat; import org.junit.Test; import com.jianggujin.codec.JBase64; import com.jianggujin.codec.JCertificate; import com.jianggujin.codec.JCertificate.JKeyStore; public class CertificateTest { @Test public void encode() throws Exception { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); char[] password = "123456".toCharArray(); String alias = "www.jianggujin.com"; String certificatePath = "test.cer"; String keyStorePath = "test.pfx"; byte[] data = "jianggujin".getBytes(); KeyStore keyStore = JCertificate.getKeyStore(getClass().getResourceAsStream(keyStorePath), password, JKeyStore.JKS); X509Certificate certificate = (X509Certificate) JCertificate .getCertificate(getClass().getResourceAsStream(certificatePath)); PrivateKey privateKey = JCertificate.getPrivateKey(keyStore, alias, password); PublicKey publicKey = JCertificate.getPublicKey(certificate); System.out.println("是否有效:" + JCertificate.verifyCertificate(certificate)); System.out.println("使用者:" + certificate.getSubjectDN().getName()); System.out.println("版本:" + certificate.getVersion()); System.out.println("序列号:" + certificate.getSerialNumber().toString(16)); System.out.println("签名算法:" + certificate.getSigAlgName()); System.out.println("证书类型:" + certificate.getType()); System.out.println("颁发者:" + certificate.getIssuerDN().getName()); System.out.println( "有效期:" + format.format(certificate.getNotBefore()) + "到" + format.format(certificate.getNotAfter())); byte[] signResult = JCertificate.sign(data, keyStore, alias, password); System.out.println("签名:" + JBase64.getEncoder().encodeToString(signResult, "UTF-8")); System.out.println("证书验签:" + JCertificate.verify(data, signResult, certificate)); System.out.println("密钥库验签:" + JCertificate.verify(data, signResult, keyStore)); byte[] result = JCertificate.encrypt(data, privateKey); System.out.println("私钥加密:" + JBase64.getEncoder().encodeToString(result, "UTF-8")); System.out.println("公钥解密:" + new String(JCertificate.decrypt(result, publicKey))); result = JCertificate.encrypt(data, publicKey); System.out.println("公钥加密:" + JBase64.getEncoder().encodeToString(result, "UTF-8")); System.out.println("私钥解密:" + new String(JCertificate.decrypt(result, privateKey))); } public void convert() throws Exception { char[] password = "123456".toCharArray(); String keyStorePath = "test.keystore"; KeyStore keyStore = JCertificate.getKeyStore(getClass().getResourceAsStream(keyStorePath), password, JKeyStore.JKS); KeyStore target = JCertificate.convert(keyStore, JKeyStore.PKCS12, password); for (String alias : JCertificate.listAlias(target)) { System.out.println(alias); } target.store(new FileOutputStream("test.pfx"), password); } } ```