要通过REST API解密AES加密字段,我在理解IV(初始化向量)以及如何使用它来解密第一个16个字符的块时遇到一个问题。
REST响应JSON(描述表单字段)中的加密字段:
"描述":" 84d1d37bdb7a3200750573ffbf96191f:0aZdRxsIqSpFtuszNr73na / J9JuMLNB> 0J6T2f2FrV0sUlMmbW4prbZMmXGnLU4W6CDlb5F1lb8js \ r \ nRHw6tfyZd5ZL // ZUlozE916wvP + ZD + GT; uUfjpk2Bl9o2uAu + 1bsNoAVdtP5m5fbnkjxf9yLRzREVVO \ r \ nIwYQOxNI / CeX2dzF / UC =&#34 ;
我能够识别出这个
" 0aZdRxsIqSpFtuszNr73na / J9JuMLNB> 0J6T2f2FrV0sUlMmbW4prbZMmXGnLU4W6CDlb5F1lb8js> R \ nRHw6tfyZd5ZL // ZUlozE916wvP + ZD + GT; uUfjpk2Bl9o2uAu + 1bsNoAVdtP5m5fbnkjxf9yLRzREVV&≠0 \ r \ nIwYQOxNI / CeX2dzF / UC ="
作为实际描述,
" 84d1d37bdb7a3200750573ffbf96191f"
在这篇文章中以某种方式与我的问题相关。
加密方法:AES 128位。
密码: 1234567890123456
原文:“新事件的新说明。
www.google.com
让我们看看初始部分是否相同,或者是否为此新事件发生了变化“
解密输出:“bGOn> 22H~KH:38 / _对于新事件。
www.google.com
让我们看看初始部分是否相同,或者是否为此新事件发生了变化“
使用解密: AES / CBC / PKCS5Padding
如何解密在Decrypted输出中混乱的第一个块。换句话说,如何解释 84d1d37bdb7a3200750573ffbf96191f 来解密前16个字符? 任何帮助将不胜感激。
以下是Java代码:
import java.io.UnsupportedEncodingException;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
public class AESDecryption {
private static String key = "1234567890123456";
private static String encryptedStr = "0aZdRxsIqSpFtuszNr73na/J9JuMLNB0J6T2f2FrV0sUlMmbW4prbZMmXGnLU4W6CDlb5F1lb8js\r\nRHw6tfyZd5ZL//ZUlozE916wvP+zd+uUfjpk2Bl9o2uAu+1bsNoAVdtP5m5fbnkjxf9yLRzREVVO\r\nIwYQOxNI/CeX2dzF/Uc=";
private static String padding = "AES/CBC/PKCS5Padding";
private static int iterationCount = 65536;
private static int keyLength = 128;
private static String secretKeyAlg = "PBEWithHmacSHA1AndAES_128";
public static void main(String[] args) throws Exception {
String finalStrDec = null;
SecretKeyFactory factory = SecretKeyFactory.getInstance(secretKeyAlg);
PBEKeySpec spec = new PBEKeySpec(key.toCharArray(), generateSalt(), iterationCount, keyLength);
SecretKey secretKey = factory.generateSecret(spec);
SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getEncoded(), "AES");
IvParameterSpec ivSpec = new IvParameterSpec(new byte[16]);
Cipher cipherDec = Cipher.getInstance(padding);
cipherDec.init(Cipher.DECRYPT_MODE, secretKeySpec, ivSpec);
byte[] original = cipherDec.doFinal(Base64.decodeBase64(encryptedStr));
finalStrDec = new String(original);
System.out.println(finalStrDec);
}
public static byte[] generateSalt() throws UnsupportedEncodingException {
SecureRandom random = new SecureRandom();
byte bytes[] = new byte[20];
random.nextBytes(bytes);
String salt = new String(bytes);
return salt.getBytes("UTF-8");
}
}