【问题标题】:Objective-c AES encryption doesn't look like java AES encryptionObjective-c AES 加密看起来不像 java AES 加密
【发布时间】:2010-09-28 18:59:26
【问题描述】:

嗯,我试图用这种方法在扩展 NSData 的目标 c 中加密一个字符串:


 @implementation NSData (AES128)

  • (NSData *)AES128Encrypt { char keyPtr[kCCKeySizeAES128] = {'\xe1','\xaa','\x9c','\x61','\x46','\x74','\x44','\x56','\xf0','\xe5','\x47','\x46','\x86','\xdc','\x95','\x77'};

    NSUInteger dataLength = [self length];

    size_t bufferSize = dataLength + kCCBlockSizeAES128; void *buffer = malloc(bufferSize);

    size_t numBytesEncrypted = 0; CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,kCCAlgorithmAES128,kCCOptionPKCS7Padding,keyPtr,kCCKeySizeAES128,NULL /* initialization vector (optional) /,[self bytes], dataLength, / input /buffer, bufferSize, / output */ &numBytesEncrypted); if (cryptStatus == kCCSuccess) { //the returned NSData takes ownership of the buffer and will free it on deallocation return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted]; }

    free(buffer); //free the buffer; return nil; }

  • (NSData *)AES128Decrypt { char keyPtr[kCCKeySizeAES128] = {'\xe1','\xaa','\x9c','\x61','\x46','\x74','\x44','\x56','\xf0','\xe5','\x47','\x46','\x86','\xdc','\x95','\x77'};

    NSUInteger dataLength = [self length];

    //See the doc: For block ciphers, the output size will always be less than or //equal to the input size plus the size of one block. //That's why we need to add the size of one block here size_t bufferSize = dataLength + kCCBlockSizeAES128; void *buffer = malloc(bufferSize);

    size_t numBytesDecrypted = 0; CCCryptorStatus cryptStatus=CCCrypt(kCCDecrypt,kCCAlgorithmAES128,kCCOptionPKCS7Padding,keyPtr, kCCKeySizeAES128,NULL /* initialization vector (optional) /,[self bytes], dataLength, / input /buffer, bufferSize, / output */&numBytesDecrypted);

    if (cryptStatus == kCCSuccess) { //the returned NSData takes ownership of the buffer and will free it on deallocation return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted]; }

    free(buffer); //free the buffer; return nil; }

@end

然后我在这里调用它:


NSString *strData = @"My string";

NSData *objNSData = [NSData dataWithData:[strData dataUsingEncoding: NSUTF8StringEncoding]];

NSLog(@"encrypted: %@",[objNSData description]);

如果我只是在目标 c 中使用它,它就可以正常工作。 但是当我尝试将它发送到 java 服务器时它不起作用。

我的密码数据如下所示:

86fcf0fa9e3dff93dc8918ffd02ee203 12de0bf8c8ba300456293c4240296c0d

如果我尝试在 java 中使用具有相同密钥的 AES 对其进行加密,我会得到:

86fcf0fa9e3dff93dc8918ffd02ee203 8388f173da143c6aeeb90e554259c83c

这很奇怪,因为前半部分是一样的。

有人知道为什么会这样吗? 谢谢。

【问题讨论】:

    标签: java iphone objective-c encryption aes


    【解决方案1】:

    我从未做过任何 Objective-C 编程,但我几乎可以肯定您在代码中的不同 modes 中使用了 AES。你需要确保这些是一致的。默认可能是Cipher Block Chaining (CBC) 模式。确保在 Java 代码中设置此选项。

    顺便说一句,CBC 模式应该有一个随机初始化向量 (IV) 而不是 NULL(我假设它使用全零)。这也需要在两者之间保持一致。

    我有义务提供标准的密码学免责声明,使用更高级别的协议来为您处理这些东西通常更安全,例如用于传输数据的 SSL/TLS 以及用于静态数据的Keyczar。正确加密真的很难,一个微小的错误(比如选择错误的模式)可能会完全破坏系统的安全性。

    【讨论】:

    • 我爱你 :) 实际上问题是我只是将 kCCOptionPKCS7Padding 选项传递给 CCCrypt 函数,我必须在其中传递 kCCOptionPKCS7Padding |无论如何,kCCOptionECBMode 选项谢谢,你的回答拯救了我的一天:)
    • 不客气。请记住,正如我之前提到的,您真的不应该使用 ECB 模式。如果可能的话,请使用 CBC 之类的东西。参见moserware.com/2009/09/stick-figure-guide-to-advanced.html 的第 3 幕第 21 场(直接链接:4.bp.blogspot.com/_Zfbv3mHcYrc/SrfI0ckVcMI/AAAAAAAABss/…
    • 问题是ECB模式似乎是obj-c支持的唯一方式
    • 根据opensource.apple.com/source/CommonCrypto/CommonCrypto-36064/…,默认(如果您不指定模式)是CBC。我会用那个。 “kCCOptionPKCS7Padding”也可以使用。只要确保你在 Java 端做同样的事情。此外,您应该使用随机初始化向量(Java 端也需要知道这一点)
    猜你喜欢
    • 1970-01-01
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    • 2011-06-05
    • 2013-07-25
    • 1970-01-01
    相关资源
    最近更新 更多