首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >iPhone (Objective-c)与Java的AES比较

iPhone (Objective-c)与Java的AES比较
EN

Stack Overflow用户
提问于 2009-10-29 01:59:18
回答 5查看 12.5K关注 0票数 16

我一整天都在绞尽脑汁想解决这个问题...

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

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

Data是保存单词"message“的NSData,使用dataUsingEncoding:NSASCIIStringEncoding Key是保存短语"1234567891123456”的NSData,再次使用如上的编码。Algorithm is ECB Options is kCCOptionsPKCS7Padding (我相信这等同于服务器上的kCCAlgorithmAES128?!)

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

代码语言:javascript
复制
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());

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

有没有人看得出我做错了什么?我想设置都是一样的.:(

  • 更新-根据请求...

好的,这就是……

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

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

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

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

谢谢。

  • 更新2- As requested...

这是iPhone代码...

代码语言:javascript
复制
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/

顺便说一下,我检查了加密、传递和iv中的字节数组,它们与服务器上的字节数组相匹配。

EN

回答 5

Stack Overflow用户

发布于 2009-10-29 02:07:10

这不是我的领域,但看起来在客户机上有PKCS7,但在服务器上有PKCS5

票数 3
EN

Stack Overflow用户

发布于 2011-10-25 23:54:37

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

代码语言:javascript
复制
NSData * encrypted = [data dataEncryptedUsingAlgorithm:kCCAlgorithmAES128 key:pass initializationVector:iv options:kCCOptionPKCS7Padding error:&status];

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

在用头撞墙了几个小时后,我终于听从了杰森的建议,检查了dataEncryptedUsingAlgorithm例程,并在FixKeyLengths之后立即打印出了keyData。原来我的128位密钥扩展到了192位,最后加上了0。修复这个问题后,一切都会正常工作。:)

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

代码语言:javascript
复制
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之前并不在那里。

如果你现在还在遇到问题,那可能是别的原因。

票数 3
EN

Stack Overflow用户

发布于 2009-10-29 02:23:49

iPhone与AES一起使用的模式是什么?您没有列出任何内容,所以这可能意味着它没有使用链接(ECB)。

然而,在Java端,您使用的是CBC,但没有指定初始化向量。这绝对是错误的。如果你真的在使用CBC,你必须有加密过程中使用的IV。IV不是秘密的;它可以与密文一起发送。

如果您真的在使用ECB,则没有IV,但是您的Java指定了错误的模式。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1638971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档