我是密码学的新手,我正在构建一些测试应用程序来尝试理解它的基本知识。我并不是试图从头开始构建算法,但我试图让两种不同的AES-256实现相互交谈。两个AES算法之间的互操作性
我有一个数据库,存储在Base64中的this Javascript implementation。现在,我试图获得一个Objective-C方法来解密它的内容,但是我在实现中的差异在哪里有点失落。我可以在Javascript中进行加密/解密,并且我可以在Cocoa中加密/解密,但是不能在JavaScript中使用JavaScript解密JavaScript中的字符串,反之亦然。
我猜测它与初始化向量,随机数,计数器操作模式或所有这些有关,坦率地说,它现在不会对我说话。
下面是我使用的Objective-C是什么,改编主要是从this和this:
@implementation NSString (Crypto)
- (NSString *)encryptAES256:(NSString *)key {
NSData *input = [self dataUsingEncoding: NSUTF8StringEncoding];
NSData *output = [NSString cryptoAES256:input key:key doEncrypt:TRUE];
return [Base64 encode:output];
}
- (NSString *)decryptAES256:(NSString *)key {
NSData *input = [Base64 decode:self];
NSData *output = [NSString cryptoAES256:input key:key doEncrypt:FALSE];
return [[[NSString alloc] initWithData:output encoding:NSUTF8StringEncoding] autorelease];
}
+ (NSData *)cryptoAES256:(NSData *)input key:(NSString *)key doEncrypt:(BOOL)doEncrypt {
// 'key' should be 32 bytes for AES256, will be null-padded otherwise
char keyPtr[kCCKeySizeAES256 + 1]; // room for terminator (unused)
bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)
// fetch key data
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [input 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 numBytesCrypted = 0;
CCCryptorStatus cryptStatus =
CCCrypt(doEncrypt ? kCCEncrypt : kCCDecrypt,
kCCAlgorithmAES128,
kCCOptionECBMode | kCCOptionPKCS7Padding,
keyPtr, kCCKeySizeAES256,
nil, // initialization vector (optional)
[input bytes], dataLength, // input
buffer, bufferSize, // output
&numBytesCrypted
);
if (cryptStatus == kCCSuccess) {
// the returned NSData takes ownership of the buffer and will free it on deallocation
return [NSData dataWithBytesNoCopy:buffer length:numBytesCrypted];
}
free(buffer); // free the buffer;
return nil;
}
@end
当然,输入为Base64编码解码事前。
我看到,每个使用相同的密钥和JavaScript中的相同内容的加密提供了一个不同的加密字符串,这与Objective-C实现不一样,总是给出相同的加密字符串。我已阅读this post的答案,它使我相信我对沿矢量初始化的某些事情是正确的,但我需要你的帮助来精确地确定发生了什么。
谢谢!
你有没有找到一种方法让两个人说话?我面对完全相同的问题,但我无法找出一种方法来使这项工作..任何帮助表示赞赏。谢谢。 – 2012-10-21 09:07:21
@Ifafavreau,我面临着和你一样的问题。你解决了吗?谢谢! – AlexR 2013-11-21 07:08:37
@AlexR,不,我没有解决它。 Accipitridae说的是真实的:两种实现方式有所不同,并没有采用这种方式。 – lpfavreau 2013-11-21 22:37:28