在Python和IOS中使用AES加密字符串



我正试图在IOS与CCCrypt和Python与Crypto中加密AES字符串。然而,我似乎得到了不同的结果。有人知道为什么吗?

我正在尝试使用256位AES与空IV和CBC。

Python代码:

key = 'verysecretkey1111111111111111111'
IV = 16 * 'x00'    
mode = AES.MODE_CBC
cipher = AES.new(key, AES.MODE_CBC, IV)
y='aaaabbbbccccdddd'
length = 16 - (len(y) % 16)
y += chr(length)*length
encoded = cipher.encrypt(y)
print base64.b64encode(encoded)

结果为gyL9jv7bTgLz8xZQx/GLYNVnVrrwo6pLsc5Ew4Vl8Uk=

目标C代码

char keyPtr[kCCKeySizeAES256 ];
bzero( keyPtr, sizeof( keyPtr ) );
// fetch key data
[key getCString:keyPtr maxLength:sizeof( keyPtr  encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [self length];

size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc( bufferSize );
size_t numBytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt( kCCEncrypt, kCCAlgorithmAES128,   kCCOptionPKCS7Padding,
                                      keyPtr, kCCKeySizeAES256,
                                      NULL /* initialization vector (optional) */,
                                      [self bytes], dataLength, /* input */
                                      buffer, bufferSize, /* output */
                                      &numBytesEncrypted );

结果为DskVKDMGxFWLGSYszL/mEersVv9zq9PK9bPIV5UgLbs=

调用Objective-C方法有一个问题,给定不完整的代码,理解错误是困难的。

问题中的这句话肯定是不正确的:

[key getCString:keyPtr maxLength:sizeof( keyPtr  encoding:NSUTF8StringEncoding];

有两个问题:
1. sizeof缺少右括号。
2. 必须为"C"字符串要求的末尾空保留空间:

char keyPtr[kCCKeySizeAES256+1];  
bzero( keyPtr, sizeof(keyPtr));
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSASCIIStringEncoding];

注意,方法getCString:返回状态,但没有检查,如果它已经存在,错误将是明显的。错误状态是开发人员最好的朋友。

但是如下面的代码所示,有一种更简单的方法来处理键。

下面是一个示例,其结果与Python代码" "匹配
NSString *key  = @"verysecretkey1111111111111111111";
NSString *data = @"aaaabbbbccccdddd";
NSData *dataIn  = [data dataUsingEncoding:NSUTF8StringEncoding];
NSData *keyData = [key  dataUsingEncoding:NSUTF8StringEncoding];
CCCryptorStatus ccStatus   = kCCSuccess;
size_t          cryptBytes = 0;
NSMutableData  *dataOut    = [NSMutableData dataWithLength:dataIn.length + kCCBlockSizeAES128];
ccStatus = CCCrypt( kCCEncrypt,
                   kCCAlgorithmAES128,
                   kCCOptionPKCS7Padding,
                   keyData.bytes, kCCKeySizeAES256,
                   NULL,
                   dataIn.bytes, dataIn.length,
                   dataOut.mutableBytes, dataOut.length,
                   &cryptBytes);
if (ccStatus != kCCSuccess) {
    NSLog(@"CCCrypt status: %d", ccStatus);
}
dataOut.length = cryptBytes;
NSString *objcEncrypted = [dataOut base64EncodedStringWithOptions:0];
NSLog(@"objcEncrypted: %@", objcEncrypted);
输出:

objcEncrypted: gyL9jv7bTgLz8xZQx/GLYNVnVrrwo6pLsc5Ew4Vl8Uk =

相关内容

  • 没有找到相关文章

最新更新