赞
踩
目录
- public class demo {
- //设置编码格式
- private static final String UTF8 = StandardCharsets.UTF_8.name();
-
- public static void main(String[] args) throws UnsupportedEncodingException {
- String str = "张三写java";
- //编码
- String encodedStr = Base64.getEncoder().encodeToString(str.getBytes(UTF8));
- System.out.println("encodedStr:" + encodedStr);
-
- //解码
- byte[] decode = Base64.getDecoder().decode(encodedStr.getBytes(UTF8));
- System.out.println("decode:"+ new String(decode,UTF8));
-
- }
- }
结果:
注意:Base64 不是加密算法,而是一种编码方式。Base64 主要用于将二进制数据编码成文本格式,以便在文本协议中传输,如在电子邮件、XML、JSON 等中。它并不是为了提供加密或安全性而设计的。
URL编码
- public class URLTest {
- //设置编码格式
- private static final String UTF8 = StandardCharsets.UTF_8.name();
-
- public static void main(String[] args) throws UnsupportedEncodingException {
- String str = "张三写java";
- //编码
- String encodedStr = URLEncoder.encode(str,UTF8);
- System.out.println("编码:"+encodedStr);
- //解码
- String decode = URLDecoder.decode(encodedStr,UTF8);
- System.out.println("解码后:"+decode);
-
- }
- }
结果:
MD5: Message-Digest Algorithm,结果占128位==>16个byte=>转成16进制字符后是32个
11111111--->ff
- public class MD5Test {
- //设置编码格式
- private static final String UTF8 = StandardCharsets.UTF_8.name();
-
- public static void main(String[] args) throws Exception {
- String str = "张三写java";
- String algorithm = "MD5";
- //获取消息摘要算法对象
- MessageDigest md = MessageDigest.getInstance(algorithm);
- // 获取原始内容的字节数组
- byte[] originalBytes = str.getBytes(UTF8);
- //获取到摘要结果
- byte[] digestBytes = md.digest(originalBytes);
- //当originalBytes比较大的时候,循环的进行update()
- //md.update(originalBytes);
- //md.digest();
- //把每一个字节转为16进制字符,最终再拼接起来这些16进制字符
- String hexStr = converBytes(digestBytes);
- System.out.println("hexStr:" + hexStr);
- }
-
- private static String converBytes(byte[] digestBytes) {
- StringBuilder sb = new StringBuilder();
- for (byte b : digestBytes) {
- //获取b的补码的后8位
- String hex = Integer.toHexString(((int)b)&0xff);
- // 15-->Integer.toHexString (15&Oxff)-->f-->0f
- // 16-- >Integer.toHexString(16&0xff)->10
- if (hex.length() == 1){
- hex = "0" + hex;
- }
- sb.append(hex);
- }
- return sb.toString();
- }
- }
代码封装,把上面公共部分提取出来
- public class HexUtils {
-
- /**
- * @description 把字节数组转为16进制字符串,如果一个字节转为16进制字符后不足两位,则前面补0
- * @author
- * @date 2023-02-23 21:02:13
- * @param digestBytes
- * @return {@link String}
- */
- public static String converBytes(byte[] digestBytes) {
- StringBuilder sb = new StringBuilder();
- for (byte b : digestBytes) {
- //获取b的补码的后8位
- String hex = Integer.toHexString(((int)b)&0xff);
- // 15-->Integer.toHexString (15&Oxff)-->f-->0f
- // 16-- >Integer.toHexString(16&0xff)->10
- if (hex.length() == 1){
- hex = "0" + hex;
- }
- sb.append(hex);
- }
- return sb.toString();
- }
- /**
- * 把16进制字符串(一定是偶数位的,因为converBytes已经处理过)转为字节数组
- * @param hexStr 16进制字符串
- * @return
- */
- public static byte[] converHex2Bytes(String hexStr) {
- //一个字节可以转为2个16进制字符
- int length = hexStr.length() / 2;
-
- byte[] reault = new byte[length];
-
- for (int i = 0; i < length; i++) {
- //hexStr : abcd
- //Integer.parseInt :把s转为10进制数,radix指定s是什么进制的数
- //获取每个字节的高4位, hexStr.substring(2,3)=>c
- int high4 = Integer.parseInt(hexStr.substring(i * 2,i * 2 + 1),16);
- //获取每个字节的低4位,hexStr.substring( 3,4)=>d
- int low4 = Integer.parseInt(hexStr.substring(i * 2 + 1,i * 2 + 2),16);
- reault[i] = (byte) (high4* 16 + low4);
- }
- return reault;
- }
- public class MessageDigestUtils {
- //设置编码格式
- private static final String UTF8 = StandardCharsets.UTF_8.name();
- /**
- * @description 执行信息再要
- * @author
- * @date 2023-02-23 21:09:55
- * @param originContent 原始字符串
- * @param algorithm 算法名字,如MD5
- * @return {@link String}
- */
- public static String doDigest(String originContent,String algorithm){
-
- try {
- //获取消息摘要算法对象
- MessageDigest md = MessageDigest.getInstance(algorithm);
- // 获取原始内容的字节数组
- byte[] originalBytes = originContent.getBytes(UTF8);
- //获取到摘要结果
- byte[] digestBytes = md.digest(originalBytes);
- //当originalBytes比较大的时候,循环的进行update()
- //md.update(originalBytes);
- //md.digest();
- //把每一个字节转为16进制字符,最终再拼接起来这些16进制字符
- String hexStr = HexUtils.converBytes(digestBytes);
- return hexStr;
- }catch (Exception e){
- e.printStackTrace();
- }
- return null;
- }
- }
- <dependency>
- <groupId>commons-codec</groupId>
- <artifactId>commons-codec</artifactId>
- <version>1.15</version>
- </dependency>
- public class MD5Test {
- //设置编码格式
- private static final String UTF8 = StandardCharsets.UTF_8.name();
-
- public static void main(String[] args) throws Exception {
- String str = "张三写java";
- System.out.println( "str:" + DigestUtils.md5Hex(str.getBytes(UTF8)));
- }
- }
结果:
SHA(Secure Hash Algorithm) :安全散列算法
sha-256=>转成16进制字符后是64个
其他如sha-0,sha-1, sha-512
SHA-256加密:
- public class Sha256Test {
- //设置编码格式
- private static final String UTF8 = StandardCharsets.UTF_8.name();
- public static void main(String[] args) throws Exception {
- String str = "张三写java";
- String algorithm = "SHA-256";
- //封装的类进行编码
- String hexStr = MessageDigestUtils.doDigest(str,algorithm);
- System.out.println("自己封装的str:" + hexStr);
-
- System.out.println("codec的str:" + DigestUtils.sha256Hex(str.getBytes(UTF8)));
- }
- }
结果:
SHA-512
- public class SHA512Test {
- //设置编码格式
- private static final String UTF8 = StandardCharsets.UTF_8.name();
- public static void main(String[] args) throws Exception {
- String str = "张三写java";
- String algorithm = "SHA-512";
- //封装的类进行编码
- String hexStr = MessageDigestUtils.doDigest(str,algorithm);
- System.out.println("自己封装的str:" + hexStr);
-
- System.out.println("codec的str:" + DigestUtils.sha512Hex(str.getBytes(UTF8)));
- }
- }
MAC(Message Authentication Code):消息认证码,是一种带有秘钥的hash函数
使用jdk实现在添加一个方法
- /**
- * @description 获取mac的消息摘要
- * @author
- * @date 2023-02-23 21:37:36
- * @param originContent 原始内容
- * @param algorithm mac算法的key
- * @param key 算法名字,例如HmacMD5
- * @return {@link String}
- */
- public static String doMacDigest(String originContent,String algorithm,String key){
-
- try {
- //获取消息摘要算法对象
- Mac mac = Mac.getInstance(algorithm);
- //
- SecretKey secretKey = new SecretKeySpec(key.getBytes(UTF8),algorithm);
- mac.init(secretKey);
- // 获取原始内容的字节数组
- byte[] originalBytes = originContent.getBytes(UTF8);
- //获取到摘要结果
- byte[] digestBytes = mac.doFinal(originalBytes);
- //当originalBytes比较大的时候,循环的进行update()
- //md.update(originalBytes);
- //md.digest();
- //把每一个字节转为16进制字符,最终再拼接起来这些16进制字符
- String hexStr = HexUtils.converBytes(digestBytes);
- return hexStr;
- }catch (Exception e){
- e.printStackTrace();
- }
- return null;
- }
使用自己封装的方法及使用codec实现mac加密
- public class MACTest {
- //设置编码格式
- private static final String UTF8 = StandardCharsets.UTF_8.name();
- public static void main(String[] args) throws Exception {
- String str = "张三写java";
- String algorithm1 = "HmacMD5";
- String algorithm2 = "HmacSHA256";
- String algorithm3 = "HmacSHA512";
- //指定秘钥, mac摘要和digest算法( md5 , sha)不同的地方就是加了盐
- String key = "123";
- //封装的类进行编码
- String hexStr1 = MessageDigestUtils.doMacDigest(str,algorithm1,key);
- String hexStr2 = MessageDigestUtils.doMacDigest(str,algorithm2,key);
- String hexStr3 = MessageDigestUtils.doMacDigest(str,algorithm3,key);
- System.out.println("HmacMD5:" + hexStr1);
- System.out.println("HmacMD5:" + hexStr2);
- System.out.println("HmacMD5:" + hexStr3);
-
- String hmacMD5HexStr = new HmacUtils(HmacAlgorithms.HMAC_MD5,key.getBytes(UTF8)).hmacHex(str.getBytes(UTF8));
- String hmacSHA256HexStr = new HmacUtils(HmacAlgorithms.HMAC_SHA_256,key.getBytes(UTF8)).hmacHex(str.getBytes(UTF8));
- String hmacSHA512HexStr = new HmacUtils(HmacAlgorithms.HMAC_SHA_512,key.getBytes(UTF8)).hmacHex(str.getBytes(UTF8));
- System.out.println("hmacMD5HexStr:"+ hmacMD5HexStr);
- System.out.println("hmacSHA256HexStr:"+ hmacSHA256HexStr);
- System.out.println("hmacSHA512HexStr:"+ hmacSHA512HexStr);
- }
- }
结果:
也叫单秘钥加密。所谓单秘钥,指的是加密和解密的过程使用相同的密钥,相比非对称加密,因只有一把钥匙,因而速度更快,更适合加解密大文件。
DES : data encryption standard,已经过时
AES : advanced encryption standard,替代des。
DES:使用Base64加密
- public class DesTest {
- //设置编码格式
- private static final String UTF8 = StandardCharsets.UTF_8.name();
- private static final String KEY = "12345678";
- //加密模式
- private static final String ALGORITHM = "DES";
-
- /**
- * 加密
- * @param text 加密内容
- * @return
- */
- public static String encrypt(String text) throws Exception {
- //获取示例
- Cipher cipher = Cipher.getInstance(ALGORITHM);
- //创建加密规则
- SecretKey secretKey = new SecretKeySpec(KEY.getBytes(UTF8), ALGORITHM);
- //加密模式规则
- cipher.init(Cipher.ENCRYPT_MODE,secretKey);
- byte[] bytes = cipher.doFinal(text.getBytes(UTF8));
- //1,使用Base64 2,转成16进制
- return Base64.encodeBase64String(bytes);
- }
-
- /**
- * 解密
- * @param encodedText 加密后的字符串
- * @return
- * @throws Exception
- */
- public static String decrypt(String encodedText) throws Exception {
- //获取示例
- Cipher cipher = Cipher.getInstance(ALGORITHM);
- //创建加密规则
- SecretKey secretKey = new SecretKeySpec(KEY.getBytes(UTF8), ALGORITHM);
- //加密模式规则
- cipher.init(Cipher.DECRYPT_MODE,secretKey);
- byte[] bytes = cipher.doFinal(Base64.decodeBase64(encodedText.getBytes(UTF8)));
- //1,使用Base64
- return new String(bytes,UTF8);
- }
-
- public static void main(String[] args) throws Exception {
- String str = "张三写java";
- //加密
- String encodedText = encrypt(str);
- System.out.println("base64编码加密后的结果"+encodedText);
- //解密
- String decrypt = decrypt(encodedText);
- System.out.println("des解密后的结果"+decrypt);
- }
- }
结果:
AES:16进制加密模式
- public class AesTest {
- //设置编码格式
- private static final String UTF8 = StandardCharsets.UTF_8.name();
- //aes默认key的长度 16,24,32位
- private static final String KEY = "12345678abcdefgh";
- //加密模式
- private static final String ALGORITHM = "AES";
-
- /**
- * 加密
- * @param text 加密内容
- * @return
- */
- public static String encrypt(String text) throws Exception {
- Cipher cipher = getCipher(Cipher.ENCRYPT_MODE, KEY);
- byte[] bytes = cipher.doFinal(text.getBytes(UTF8));
- //转成16进制
- return HexUtils.converBytes(bytes);
- }
-
- /**
- * 解密
- * @param encodedText 16进制编码后的字符串
- * @return
- * @throws Exception
- */
- public static String decrypt(String encodedText) throws Exception {
- byte[] bytes = HexUtils.converHex2Bytes(encodedText);
- Cipher cipher = getCipher(Cipher.DECRYPT_MODE, KEY);
- byte[] decryptedBytes = cipher.doFinal(bytes);
- //2,转成16进制
- return new String(decryptedBytes,UTF8);
- }
-
- /**
- * 获取Cipher对象
- * @param type 加密解密模式
- * @param seed 密钥
- * @return
- * @throws Exception
- */
- public static Cipher getCipher(int type,String seed) throws Exception{
- //获取示例
- Cipher cipher = Cipher.getInstance(ALGORITHM);
- //创建加密规则
- SecretKey secretKey = new SecretKeySpec(seed.getBytes(UTF8), ALGORITHM);
- //加密模式规则
- cipher.init(type,secretKey);
-
- return cipher;
- }
-
- public static void main(String[] args) throws Exception {
- String str = "张三写java";
- //加密
- String encodedText = encrypt(str);
- System.out.println("16进制编码aes加密后的结果"+encodedText);
- //解密
- String decrypt = decrypt(encodedText);
- System.out.println("aes解密后的结果"+decrypt);
- }
- }
AES:16进制加密模式代码优化
- public class AesTest {
- //设置编码格式
- private static final String UTF8 = StandardCharsets.UTF_8.name();
- //aes默认key的长度 16,24,32位
- private static final String KEY = "12345678";
- //加密模式
- private static final String ALGORITHM = "AES";
-
- /**
- * 加密
- * @param text 加密内容
- * @return
- */
- public static String encrypt(String text) throws Exception {
- Cipher cipher = getCipher(Cipher.ENCRYPT_MODE, KEY);
- byte[] bytes = cipher.doFinal(text.getBytes(UTF8));
- //转成16进制
- return HexUtils.converBytes(bytes);
- }
-
- /**
- * 解密
- * @param encodedText 16进制编码后的字符串
- * @return
- * @throws Exception
- */
- public static String decrypt(String encodedText) throws Exception {
- byte[] bytes = HexUtils.converHex2Bytes(encodedText);
- Cipher cipher = getCipher(Cipher.DECRYPT_MODE, KEY);
- byte[] decryptedBytes = cipher.doFinal(bytes);
- //2,转成16进制
- return new String(decryptedBytes,UTF8);
- }
-
- /**
- * 获取Cipher对象
- * @param type 加密解密模式
- * @param seed 密钥
- * @return
- * @throws Exception
- */
- public static Cipher getCipher(int type,String seed) throws Exception{
- //获取示例
- Cipher cipher = Cipher.getInstance(ALGORITHM);
- //创建加密规则
- //创建keyGenerator对象,可以根据传入的key生成一个指定长度的key
- KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM);
- //初始化secureRandom,并指定生成指定长度key的算法
- SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
- secureRandom.setSeed(seed.getBytes(UTF8));
- keyGenerator.init(128,secureRandom);
- //通过keyGenerator生成新的秘钥
- SecretKey secretKey = keyGenerator.generateKey();
- //获取到新秘钥的字节数组
- byte[] encoded = secretKey.getEncoded();
- SecretKeySpec secretKeySpec = new SecretKeySpec(encoded, ALGORITHM);
-
- //加密模式规则
- cipher.init(type,secretKeySpec);
-
- return cipher;
- }
-
- public static void main(String[] args) throws Exception {
- String str = "张三写java";
- //加密
- String encodedText = encrypt(str);
- System.out.println("16进制编码aes加密后的结果"+encodedText);
- //解密
- String decrypt = decrypt(encodedText);
- System.out.println("aes解密后的结果"+decrypt);
- }
- }
AES:base64加密模式
- public class AesBase64Test {
- //设置编码格式
- private static final String UTF8 = StandardCharsets.UTF_8.name();
- private static final String KEY = "12345678";
- //加密模式
- private static final String ALGORITHM = "AES";
-
- /**
- * 加密
- * @param text 加密内容
- * @return
- */
- public static String encrypt(String text) throws Exception {
- Cipher cipher = getCipher(Cipher.ENCRYPT_MODE, KEY);
- byte[] bytes = cipher.doFinal(text.getBytes(UTF8));
- //1,使用Base64 2,转成16进制
- return Base64.encodeBase64String(bytes);
- }
-
- /**
- * 解密
- * @param encodedText 加密后的字符串
- * @return
- * @throws Exception
- */
- public static String decrypt(String encodedText) throws Exception {
- Cipher cipher = getCipher(Cipher.DECRYPT_MODE, KEY);
- byte[] bytes = cipher.doFinal(Base64.decodeBase64(encodedText.getBytes(UTF8)));
- //1,使用Base64 2,转成16进制
- return new String(bytes,UTF8);
- }
-
- public static Cipher getCipher(int type,String seed) throws Exception{
- //获取示例
- Cipher cipher = Cipher.getInstance(ALGORITHM);
- //创建加密规则
- //创建keyGenerator对象,可以根据传入的key生成一个指定长度的key
- KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM);
- //初始化secureRandom,并指定生成指定长度key的算法
- SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
- secureRandom.setSeed(seed.getBytes(UTF8));
- keyGenerator.init(128,secureRandom);
- //通过keyGenerator生成新的秘钥
- SecretKey secretKey = keyGenerator.generateKey();
- //获取到新秘钥的字节数组
- byte[] encoded = secretKey.getEncoded();
- SecretKeySpec secretKeySpec = new SecretKeySpec(encoded, ALGORITHM);
-
- //加密模式规则
- cipher.init(type,secretKeySpec);
-
- return cipher;
- }
-
- /**
- * 测试
- * @param args
- * @throws Exception
- */
- public static void main(String[] args) throws Exception {
- String str = "张三写java";
- //加密
- String encodedText = encrypt(str);
- System.out.println("base64编码aes加密后的结果" + encodedText);
- //解密
- String decrypt = decrypt(encodedText);
- System.out.println("aes解密后的结果" + decrypt);
- }
- }
定义:加密和解密使用的是两个不同的密钥(public key和private key).公钥可以给任何人,私钥总
是自己保留。
常见算法:RSA
应用场景:
1、加解密:可以使用公钥加密,对应的就是私钥解密;也可以使用私钥加密,对应的就是公钥解
密。
- public class RSATest2 {
- public static final String CHARSET = "UTF-8";
- public static final String RSA_ALGORITHM = "RSA";
-
- //生成密钥对,一般来说执行一次就行
- public static Map<String, String> createKeys(int keySize) {
- //为RSA算法创建一个KeyPairGenerator对象(KeyPairGenerator,密钥对生成器,用于生成公钥和私钥对)
- KeyPairGenerator kpg;
- try {
- kpg = KeyPairGenerator.getInstance(RSA_ALGORITHM);
- } catch (NoSuchAlgorithmException e) {
- throw new IllegalArgumentException("No such algorithm-->[" + RSA_ALGORITHM + "]");
- }
-
- //初始化KeyPairGenerator对象,密钥长度
- kpg.initialize(keySize);
- //生成密匙对
- KeyPair keyPair = kpg.generateKeyPair();
- //得到公钥
- Key publicKey = keyPair.getPublic();
- String publicKeyStr = Base64.encodeBase64URLSafeString(publicKey.getEncoded()); //返回一个publicKey经过二次加密后的字符串
- //得到私钥
- Key privateKey = keyPair.getPrivate();
- String privateKeyStr = Base64.encodeBase64URLSafeString(privateKey.getEncoded()); //返回一个privateKey经过二次加密后的字符串
-
- Map<String, String> keyPairMap = new HashMap<String, String>();
- keyPairMap.put("publicKey", publicKeyStr);
- keyPairMap.put("privateKey", privateKeyStr);
-
- return keyPairMap;
- }
-
- /**
- * 得到公钥
- *
- * @param publicKey 密钥字符串(经过base64编码)
- * @throws Exception
- */
- public static RSAPublicKey getPublicKey(String publicKey) throws Exception {
- //通过X509编码的Key指令获得公钥对象
- KeyFactory keyFactory = KeyFactory.getInstance(RSA_ALGORITHM);
- X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(Base64.decodeBase64(publicKey));
- RSAPublicKey key = (RSAPublicKey) keyFactory.generatePublic(x509KeySpec);
- return key;
- }
-
- /**
- * 得到私钥
- *
- * @param privateKey 密钥字符串(经过base64编码)
- * @throws Exception
- */
- public static RSAPrivateKey getPrivateKey(String privateKey) throws Exception {
- //通过PKCS#8编码的Key指令获得私钥对象
- KeyFactory keyFactory = KeyFactory.getInstance(RSA_ALGORITHM);
- PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKey));
- RSAPrivateKey key = (RSAPrivateKey) keyFactory.generatePrivate(pkcs8KeySpec);
- return key;
- }
-
- /**
- * 公钥加密
- *
- * @param data
- * @param publicKey
- * @return
- */
- public static String publicEncrypt(String data, RSAPublicKey publicKey) {
- try {
- Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);
- cipher.init(Cipher.ENCRYPT_MODE, publicKey);
- return Base64.encodeBase64URLSafeString(rsaSplitCodec(cipher, Cipher.ENCRYPT_MODE, data.getBytes(CHARSET), publicKey.getModulus().bitLength()));
- } catch (Exception e) {
- throw new RuntimeException("加密字符串[" + data + "]时遇到异常", e);
- }
- }
-
- /**
- * 私钥解密
- *
- * @param data
- * @param privateKey
- * @return
- */
- public static String privateDecrypt(String data, RSAPrivateKey privateKey) {
- try {
- Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);
- cipher.init(Cipher.DECRYPT_MODE, privateKey);
- return new String(rsaSplitCodec(cipher, Cipher.DECRYPT_MODE, Base64.decodeBase64(data), privateKey.getModulus().bitLength()), CHARSET);
- } catch (Exception e) {
- throw new RuntimeException("解密字符串[" + data + "]时遇到异常", e);
- }
- }
-
- /**
- * 私钥加密
- *
- * @param data
- * @param privateKey
- * @return
- */
- public static String privateEncrypt(String data, RSAPrivateKey privateKey) {
- try {
- Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);
- cipher.init(Cipher.ENCRYPT_MODE, privateKey);
- return Base64.encodeBase64URLSafeString(rsaSplitCodec(cipher, Cipher.ENCRYPT_MODE, data.getBytes(CHARSET), privateKey.getModulus().bitLength()));
- } catch (Exception e) {
- throw new RuntimeException("加密字符串[" + data + "]时遇到异常", e);
- }
- }
-
- /**
- * 公钥解密
- *
- * @param data
- * @param publicKey
- * @return
- */
- public static String publicDecrypt(String data, RSAPublicKey publicKey) {
- try {
- Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);
- cipher.init(Cipher.DECRYPT_MODE, publicKey);
- return new String(rsaSplitCodec(cipher, Cipher.DECRYPT_MODE, Base64.decodeBase64(data), publicKey.getModulus().bitLength()), CHARSET);
- } catch (Exception e) {
- throw new RuntimeException("解密字符串[" + data + "]时遇到异常", e);
- }
- }
-
- private static byte[] rsaSplitCodec(Cipher cipher, int opmode, byte[] datas, int keySize) {
- int maxBlock = 0;
- if (opmode == Cipher.DECRYPT_MODE) {
- maxBlock = keySize / 8;
- } else {
- maxBlock = keySize / 8 - 11;
- }
- ByteArrayOutputStream out = new ByteArrayOutputStream();
- int offSet = 0;
- byte[] buff;
- int i = 0;
- try {
- while (datas.length > offSet) {
- if (datas.length - offSet > maxBlock) {
- buff = cipher.doFinal(datas, offSet, maxBlock);
- } else {
- buff = cipher.doFinal(datas, offSet, datas.length - offSet);
- }
- out.write(buff, 0, buff.length);
- i++;
- offSet = i * maxBlock;
- }
- } catch (Exception e) {
- throw new RuntimeException("加解密阀值为[" + maxBlock + "]的数据时发生异常", e);
- }
- byte[] resultDatas = out.toByteArray();
- IOUtils.closeQuietly(out);
- return resultDatas;
- }
-
-
-
- //测试
- public static void main(String[] args) throws Exception {
- //生成公私钥
- Map<String, String> keyMap = RSATest2.createKeys(512);
- //公钥
- String publicKey = keyMap.get("publicKey");
-
- //私钥
- String privateKey = keyMap.get("privateKey");
-
-
- System.out.println("公钥加密——私钥解密");
- String str = "法外狂徒张三";
- System.out.println("明文:" + str);
- System.out.println("明文大小:" + str.getBytes().length);
- //对内容进行公钥加密
- String encodedData = RSATest2.publicEncrypt(str, RSATest2.getPublicKey(publicKey));
- System.out.println("公钥加密密文:" + encodedData);
- //用私钥对密文进行解密
-
- String decodedData = RSATest2.privateDecrypt(encodedData, RSATest2.getPrivateKey(privateKey));
- System.out.println("解密后文字: " + decodedData);
- }
-
- }
2、数字签名
3、数字信封
4、数字证书
参考视频:密码学-java信息安全,摘要算法,对称加密(AES)/非对称加密(RSA),一应俱全_哔哩哔哩_bilibili
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。