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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (45)

我一整天都在试图解决这个问题。

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

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

数据是NSData持有单词“消息”使用dataUsingEncoding:NSASCIIStringEncoding 密钥是NSData持有短语“1234567891123456”再次使用编码如上。算法是kCCAlgorithmAES128 选项kCCOptionsPKCS7Padding(我相信它等同于服务器上的ECB?!)

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

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客户端正在加密以下字符串“消息”它使用密钥“1234567891123456”它使用“1010101010101010”的初始化向量它使用AES128,以CBC模式(据我所知)和kCCOptionsPKCS7Padding的选项。

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

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

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

这里是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中的字节数组,它们与服务器上的字节数组相匹配。

提问于
用户回答回答于

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

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

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

在过去的几个小时里,我的头撞在墙上后,我终于听从杰森的建议,并检查了dataEncryptedUsingAlgorithm程序并keyData马上打印出来FixKeyLengths。事实证明,我的128位密钥已扩展到192位,并添加了0。解决这个问题后,一切正常。:)

这个问题似乎在最新的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不在之前。

热门问答

使用微信小程序也可以做腾讯云的标准视频直播吗?使用微信小程序做腾讯云的视频直播和im即时通讯可行吗?

美女视频一起走向共同富裕
推荐
支持的 IM部分,集成云通信 https://cloud.tencent.com/document/product/269/36838 标准直播部分,使用live-pusher和live-player标签,然后用云直播即可 https://cloud.tencent.com/do...... 展开详请

为什么我通过控制台vnc看到的界面和用vnc viewer看的的界面不一样???

HappyLau谈云计算专注于公有云,私有云解决方案,在kubernetes,openstack,kvm,ceph,linux,shell有丰富的实战经验。
推荐

控制台页面使用的是novnc,novnc是一种基于web页面使用的vnc客户端,详情可参考https://github.com/novnc/noVNC介绍,常规的vnc viewer是图形的客户端,所使用的依赖库有所不同,因此显示也不一样。

iOS在release下不走sendProcessBlock进度回调?

karis

腾讯 · 客户端开发工程师 (已认证)

Karis
推荐

请问是哪个版本的sdk呢,调用代码方便贴一下吗,最好能提供一个能复现的demo哈

API获取域名列表一直AuthFailure,code:4100?

推荐
推荐使用SDK进行调用:https://github.com/QcloudApi/qcloudapi-sdk-python 如果要自己写,也请参考下签名文档中python的代码示例,或者SDK中的源码:https://github.com/QcloudApi/qcloudapi-...... 展开详请

请问有图片鉴黄和文字甄别功能吗?现文字违规监控那么严格,有什么好的检测吗?

推荐已采纳
有的。 腾讯云 CDN 结合腾讯优图的深度学习图像识别技术,推出“图片鉴黄”服务,针对 CDN 全网分发的图片进行智能扫描,有效规避您的业务涉黄风险,目前全网免费公测中。参考文档:https://cloud.tencent.com/document/product/228/117...... 展开详请

对象存储如何通过子账户密钥上传文件?

所属标签

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励