V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
scfhao
V2EX  ›  iDev

AES 解密服务器加密过的文本,总是解不出来,求出路

  •  
  •   scfhao ·
    scfhao · 2016-01-18 15:23:17 +08:00 · 4727 次点击
    这是一个创建于 2993 天前的主题,其中的信息可能已经有所发展或是发生改变。

    参考的安卓端解密的代码写的,但安卓端解密没问题,我写的一直解不出来。
    安卓解密代码如下:
    java
    byte[] keyBy = key.getBytes("utf-8");
    Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding");
    SecretKeySpec keyspec = new SecretKeySpec(keyBy, "AES");
    cipher.init(Cipher.DECRYPT_MODE, keyspec);
    return cipher.doFinal(toDecrypt);

    我写的 Objective-C 代码:
    ```ObjC
    char keyPtr[kCCKeySizeAES128+1];
    bzero(keyPtr, sizeof(keyPtr));
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

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

    size_t numBytesDecrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding | kCCOptionECBMode, keyPtr, kCCKeySizeAES128, NULL, [data bytes], dataLength, buffer, bufferSize, &numBytesDecrypted);
    if (cryptStatus == kCCSuccess) {
    return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted freeWhenDone:YES];
    }
    free(buffer);
    return nil;
    ```
    PKCS7Padding 、 ECB 、密钥都一致,但解出来的东西不一样,我把 128 、 192 、 256 这三种密钥长度也都试了一遍也不行,求大神指点一下还可能是什么地方的问题?

    第 1 条附言  ·  2016-01-22 10:10:06 +08:00
    更新:
    通过解密在线加密网站 AES 加密后的数据, iOS 的代码和安卓的代码都可以解密到正确的原始文本,但解密一个二进制文件的内容就有问题了。
    安卓的步骤是从使用 FileInputStream 读取文件内容,然后将 FileInputStream 中的 buffer 转换为 Byte 数组进行解密, iOS 端是直接[NSData dataWithContentOfFile:],然后[data bytes]得到字节数组进行解密,我觉得这是没区别的,但还是没解析到正确的内容。
    11 条回复    2016-01-22 23:32:20 +08:00
    kenneth
        1
    kenneth  
       2016-01-18 17:02:40 +08:00
    可以换个语言来解解,看看算法是否正确。
    suchj
        2
    suchj  
       2016-01-18 17:25:53 +08:00
    这种问题可以这样解决:

    在参考语言的版本里打印每一步的中间结果,然后在你所的的语言里也把第一步的中间结果打印出来,对比就知道最早出错的是在哪一步,逐步向下,就能写出新语言的版本。
    yzimhao
        3
    yzimhao  
       2016-01-18 17:39:22 +08:00
    可以试试 这个在线加解密工具
    http://www.kjson.com/encrypt/enc/
    Codist
        4
    Codist  
       2016-01-18 17:46:38 +08:00
    之前遇到过一次, php 较低版本对于长度不足的密钥和初始向量会在其后补齐 '\0' 使其达到有效长度, java 应该是截取有效长度,密钥碰巧又多了一个字符,调了半天才发现
    janxin
        5
    janxin  
       2016-01-18 19:11:47 +08:00
    找一个第三方工具,快速加密解密结果确认问题出在哪一边
    scfhao
        7
    scfhao  
    OP
       2016-01-21 15:39:32 +08:00
    更新:
    1 )找到个不错的在线加解密工具: http://www.seacha.com/tools/aes.html
    2 )问题中的 iOS 代码和安卓代码都可以正确解密到原文本,但 iOS 的代码无法从加密过的二进制文件中解密文本(安卓代码却可以),这有可能是哪里的问题?
    xuzhongzhou
        8
    xuzhongzhou  
       2016-01-21 16:48:57 +08:00
    @scfhao 楼主看看二进制文件是加密后的,还是 base64 编码过的。
    iOS 的代码粗看看不出什么问题。自己试过后端加密后的数据解不出来,有的人习惯加密后的数据以 base64 encode 的字符串返回,有的是直接以十六进制的字符串返回。
    scfhao
        9
    scfhao  
    OP
       2016-01-21 20:59:27 +08:00
    @xuzhongzhou 直接从服务器下载的数据文件(不是字符串形式),安卓端也没有 base64 编码转换的过程,我也试过用 base64 转换。
    scfhao
        10
    scfhao  
    OP
       2016-01-22 22:42:51 +08:00
    Update :找了这么多天原因,绕回原点,才发现“竟然”是因为密钥不对应。之前和一个同事对了一下密钥:一致,便以为那个密钥是正确的,然后一直朝别的方向找原因,以至于浪费了很多时间。第一次在 v 站发帖,找到原因后突然觉得这个问题问的一点都没意义,因为前提就错了,然后发现 V2EX 不能删帖。
    @kenneth
    @suchj
    @yzimhao
    @Codist
    @janxin
    @anerevol
    @xuzhongzhou
    感谢各位的回复!
    iOran
        11
    iOran  
       2016-01-22 23:32:20 +08:00
    V 站设置不能删帖,还是有他的道理的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2834 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 13:19 · PVG 21:19 · LAX 06:19 · JFK 09:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.