REST API响应的解密

时间:2017-05-31 09:53:36

标签: java encryption

要通过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");
}
}

0 个答案:

没有答案