iPhone(Objective-c)和Java之间的AES差异

2022-09-03 07:53:56

我整天都在撕扯我的头发,试图解决这个问题...

我有一个在iPhone上运行的objective-c客户端,连接到Java服务器。iPhone正在使用AES加密数据,但我无法在服务器上解密它。我正在使用已知的密码和消息(单个字符串),并在iPhone上生成字节数组,使用相同的键和消息在Java服务器上生成比较字节数组,但字节数组完全不同(因此无法在Java端解码)。

客户端正在使用以下设置的 CommonCrypto 库...

数据是使用Key持有“消息”一词是使用上述编码再次持有短语“1234567891123456”。算法是选项(我相信这等同于服务器上的ECB?!NSDatadataUsingEncoding:NSASCIIStringEncodingNSDatakCCAlgorithmAES128kCCOptionsPKCS7Padding

服务器正在使用以下代码...

byte[] key = "1234567891123456".getBytes();
Cipher c = Cipher.getInstance("AES/ECB/PKCS5Padding");

SecretKeySpec k =  new SecretKeySpec(key, "AES");
c.init(Cipher.ENCRYPT_MODE, k);
byte[] encryptedData = c.doFinal("message".getBytes());

但是加密数据中的数据与 objective-c 代码中生成的数据不匹配,字节数组完全不同。

有人能看到我做错了什么吗?我认为设置都是一样的...:(

  • 更新 - 根据要求....

好吧,所以这里开始了...

iPhone客户端正在加密以下字符串“message”它使用密钥“1234567891123456”它使用“1010101010101010”的初始化向量它使用AES128,具有CBC模式(据我所知)和kCCOptionsPKCS7Padding的选项。

加密的结果(使用base64编码)是UHIYllDFAXl81ZM7OZPAuA==

服务器正在使用相同的密钥和初始化向量加密相同的字符串。它使用以下 Cipher.getInstance(“AES/CBC/PKCS5Padding”);

加密的结果(使用base64编码)是ALBnFIHysLbvAxjvtNo9vQ==

谢谢。

  • 更新 2 - 根据要求...

这是iPhone代码....

NSData *toencrypt = [@"message" dataUsingEncoding:NSASCIIStringEncoding];

NSData *pass = [@"1234567891123456" dataUsingEncoding:NSASCIIStringEncoding];

NSData *iv = [@"1010101010101010" dataUsingEncoding:NSASCIIStringEncoding];    

CCCryptorStatus status = kCCSuccess;

NSData *encrypted = [toencrypt dataEncryptedUsingAlgorithm:kCCAlgorithmAES128 key:pass initializationVector:iv options:kCCOptionPKCS7Padding error:&status];

NSString *text = [NSString base64StringFromData:encrypted length:[encrypted length]];

用于加密的NSData类别来自此处...

http://github.com/AlanQuatermain/aqtoolkit/tree/master/CommonCrypto/

顺便说一句,我已经检查了toencrypt,pass和iv中的字节数组,它们与服务器上的字节数组相匹配。


答案 1

这不是我的区域,但它看起来像在你拥有的客户端上,但在服务器上你有。PKCS7PKCS5


答案 2

我只是遇到了完全相同的问题。我在iOS客户端上使用CommonCrypto,使用设置:

NSData * encrypted = [data dataEncryptedUsingAlgorithm:kCCAlgorithmAES128 key:pass initializationVector:iv options:kCCOptionPKCS7Padding error:&status];

服务器使用与客户端相同的密钥和初始化向量。Cipher.getInstance("AES/CBC/PKCS5Padding");

在用头撞墙了几个小时后,我终于听从了杰森的建议,检查了例行程序,并立即打印出来。事实证明,我的128位密钥被扩展到192位,最后增加了0。修复此问题后,一切正常。:)dataEncryptedUsingAlgorithmkeyDataFixKeyLengths

更新:我的答案是在大约2年前发布的,这个问题似乎在最新的NSData + CommonCrypto代码中得到了修复。具体来说,这是导致问题的部分:

static void FixKeyLengths( CCAlgorithm algorithm, NSMutableData * keyData, NSMutableData * ivData )
{
  NSUInteger keyLength = [keyData length];
  switch ( algorithm )
  {
    case kCCAlgorithmAES128:
    {
      if ( keyLength <= 16 )
      {
        [keyData setLength: 16];
      }
      else if ( keyLength <= 24 )
      {
        [keyData setLength: 24];
      }
      else
      {
        [keyData setLength: 32];
      }

      break;
    }

第一次检查以前没有。keyLength <= 16

如果您现在仍然遇到问题,则可能是其他问题。


推荐