繁体   English   中英

Java和Objective C中的AES128 CBC加密提供不同的输出

[英]AES128 CBC encryption in Java and Objective C giving different outputs

我的Java和客观C加密方法正在产生不同的输出-AES128,CBC模式。

键: YnA+lracf9xaiJO1oA/bTQ==
iV: 190Dt3MNeL32o9Kd37HZlQ==
纯文本: text to encrypt

Java输出: mHZpz52LOK2K76t3B/EUuA==
目标C输出: Fb0D46H4tN+ukgI05x/Dbg==

Java代码:

public static String AESEncrypt(String text, String key, String iv) throws Exception {
     Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
     byte[] keyBytes = new byte[16];
     byte[] b = key.getBytes("UTF-8");
     int len = b.length;
     if (len > keyBytes.length)
         len = keyBytes.length;
     System.arraycopy(b, 0, keyBytes, 0, len);

     byte[] keyBytesiv = new byte[16];
     byte[] biv = iv.getBytes("UTF-8");
     int leniv = biv.length;
     if (leniv > keyBytesiv.length)
         leniv = keyBytesiv.length;
     System.arraycopy(biv, 0, keyBytes, 0, len);
     SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
     IvParameterSpec ivSpec = new IvParameterSpec(keyBytesiv);

     cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);

     byte[] results = cipher.doFinal(text.getBytes("UTF-8"));
     BASE64Encoder encoder = new BASE64Encoder();
     return encoder.encode(results);
 }

目标C代码

+ (NSData *)AESOperation:(CCOperation)operation OnData:(NSData *)data key:(NSData *)key iV:(NSData *) iv {

  NSUInteger dataLength = [data length];
  size_t bufferSize = dataLength + kCCBlockSizeAES128;
  void *buffer = malloc(bufferSize);

  size_t numBytesEncrypted = 0;
  CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
                                      kCCAlgorithmAES128,
                                      kCCOptionPKCS7Padding,
                                      [key bytes],
                                      kCCBlockSizeAES128,
                                      [iv bytes],
                                      [data bytes],
                                      dataLength,
                                      buffer,
                                      bufferSize,
                                      &numBytesEncrypted);
  if (cryptStatus == kCCSuccess) {
     return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
  }

  free(buffer);
  return nil;
}

有两种解决此类问题的方法,可以结合使用:

  • 作为健全性检查,请尝试解密两种语言的加密文本,然后查看它们是否与原始文本匹配。

  • 尝试使用另一个库(第三个库),然后与前两个值进行比较。

因此,我尝试使用在线工具解密密文,并且可以使用Objective C输出恢复原始文本(“要加密的文本”)。 它表明Java代码有问题。 我怀疑这可能与输入(键,iv)是base64编码的事实有关,而它似乎只是被视为UTF-8编码( getBytes()调用)。

由于上述建议,我得以解决Java代码上的问题。 这是为我在Java和目标C上实现AES128 CBC模式而工作的Java代码

public static String AESEncrypt(String text, String key, String iv) throws Exception {

     Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
     byte[] keyBytes = new byte[16];
     byte[] b = new BASE64Decoder().decodeBuffer(key);
     int len = b.length;
     if (len > keyBytes.length)
         len = keyBytes.length;
     System.arraycopy(b, 0, keyBytes, 0, len);

     byte[] keyBytesiv = new byte[16];
     byte[] biv = new BASE64Decoder().decodeBuffer(iv);
     int leniv = biv.length;
     if (leniv > keyBytesiv.length)
         leniv = keyBytesiv.length;
     System.arraycopy(biv, 0, keyBytesiv, 0, len);

     SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
     IvParameterSpec ivSpec = new IvParameterSpec(keyBytesiv);

     cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);

     byte[] results = cipher.doFinal(text.getBytes("UTF-8"));
     BASE64Encoder encoder = new BASE64Encoder();
     return encoder.encode(results);
 }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM