JAVA签名
java非对称加密
对称加密:
加密、解密是同一把钥匙
举例:AES
1、生成钥匙:
KeyGenerator generator= KeyGenerator.getInstance("AES");
generator.init(1024); //1024位长度的密钥可以加密1024/8=128长度的明文,因此过长的明文需要使用分块加密
SecretKey secret = generator.generateKey();
2、加密:
SecretKeySpec keySpec=new SecretKeySpec(secret.getEncoded(),"AES");
Cipher cipher=Cipher.getInstance("AES/ECB/PKCS5Padding"); /算法/格式/填充方式
cipher.init(Cipher.ENCRYPT_MODE,keySpec);
byte [] bytes=cipher.doFinal(text.getBytes());
return Base64.getEncoder().encodeToString(bytes);
3、
3.1、密钥(SecretKey类型) ----->Base64编码(字符串类型)------>传输给B:
略
3.2、字符串----->Base64解码(字节数组)------->SecretKey类型类型:
byte[] decode = Base64.getDecoder().decode(val); //val 是密钥字符串类型
byte[] bytes = CreateSecretKey.hexToBytes(new String(decode));
SecretKey spec=new SecretKeySpec(bytes,"AES");
4、解密:
byte [] bytes =Base64.getDecoder().decode(entext); // entext 密文
SecretKeySpec keySpec= new SecretKeySpec(key.getEncoded(),"AES");
//如果服务商不同,需要指明算法提供商getInstance(SIGNATURE_ALGORITHM,String provider) 或者getInstance(SIGNATURE_ALGORITHM,Provider provider)
Cipher cipher=Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE,keySpec); //第一个参数和加密时不同
byte[] result = cipher.doFinal(bytes);
return new String (result);