【发布时间】:2016-01-10 20:22:23
【问题描述】:
所以我有我的 iOS 代码:
#import <CommonCrypto/CommonCrypto.h>
NSString* password = @"1234567890123456";
NSString* salt = @"gettingsaltyfoo!";
-(NSString *)decrypt:(NSString*)encrypted64{
NSMutableData* hash = [NSMutableData dataWithLength:CC_SHA256_DIGEST_LENGTH];
NSMutableData* key = [NSMutableData dataWithLength:CC_SHA256_DIGEST_LENGTH];
CC_SHA256(salt.UTF8String, (CC_LONG)strlen(salt.UTF8String), hash.mutableBytes);
CCKeyDerivationPBKDF(kCCPBKDF2, password.UTF8String, strlen(password.UTF8String), hash.bytes, hash.length, kCCPRFHmacAlgSHA1, 1000, key.mutableBytes, key.length);
NSLog(@"Hash : %@",[hash base64EncodedStringWithOptions:0]);
NSLog(@"Key : %@",[key base64EncodedStringWithOptions:0]);
NSData* encryptedWithout64 = [[NSData alloc] initWithBase64EncodedString:encrypted64 options:0];
NSMutableData* decrypted = [NSMutableData dataWithLength:encryptedWithout64.length + kCCBlockSizeAES128];
size_t bytesDecrypted = 0;
CCCrypt(kCCDecrypt,
kCCAlgorithmAES128,
kCCOptionPKCS7Padding,
key.bytes,
key.length,
NULL,
encryptedWithout64.bytes, encryptedWithout64.length,
decrypted.mutableBytes, decrypted.length, &bytesDecrypted);
NSData* outputMessage = [NSMutableData dataWithBytes:decrypted.mutableBytes length:bytesDecrypted];
NSString* outputString = [[NSString alloc] initWithData:outputMessage encoding:NSUTF8StringEncoding];
NSLog(@"Decrypted : %@",outputString);
return outputString;
}
-(NSString *)encrypt:(NSString *)toEncrypt{
NSMutableData* hash = [NSMutableData dataWithLength:CC_SHA256_DIGEST_LENGTH];
NSMutableData* key = [NSMutableData dataWithLength:CC_SHA256_DIGEST_LENGTH];
CC_SHA256(salt.UTF8String, (CC_LONG)strlen(salt.UTF8String), hash.mutableBytes);
CCKeyDerivationPBKDF(kCCPBKDF2, password.UTF8String, strlen(password.UTF8String), hash.bytes, hash.length, kCCPRFHmacAlgSHA1, 1000, key.mutableBytes, key.length);
NSData* message = [toEncrypt dataUsingEncoding:NSUTF8StringEncoding];
NSMutableData* encrypted = [NSMutableData dataWithLength:message.length + kCCBlockSizeAES128];
size_t bytesEncrypted = 0;
CCCrypt(kCCEncrypt,
kCCAlgorithmAES128,
kCCOptionPKCS7Padding,
key.bytes,
key.length,
NULL,
message.bytes, message.length,
encrypted.mutableBytes, encrypted.length, &bytesEncrypted);
NSString* encrypted64 = [[NSMutableData dataWithBytes:encrypted.mutableBytes length:bytesEncrypted] base64EncodedStringWithOptions:0];
NSLog(@"Encrypted : %@",encrypted64);
return encrypted64;
}
我有我的 node.js 代码:
var CryptoJS = require("crypto-js");
var crypto = require('crypto');
var password = "1234567890123456";
var salt = "gettingsaltyfoo!";
var hash = CryptoJS.SHA256(salt);
var key = CryptoJS.PBKDF2(password, hash, { keySize: 256/32, iterations: 1000 });
var algorithm = 'aes128';
function encrypt(text){
var cipher = crypto.createCipher(algorithm,key.toString(CryptoJS.enc.Base64));
var crypted = cipher.update(text,'utf8','hex');
crypted += cipher.final('hex');
console.log(crypted);
console.log(hash.toString(CryptoJS.enc.Base64));
console.log(key.toString(CryptoJS.enc.Base64));
return crypted;
}
function decrypt(text){
var decipher = crypto.createDecipher(algorithm,key.toString(CryptoJS.enc.Base64));
var dec = decipher.update(text,'hex','utf8');
dec += decipher.final('utf8');
console.log(dec);
return dec;
}
问题:不幸的是,虽然我有相同的哈希、密钥和最终解密的值(意味着它们可以独立工作),但我得到的加密值不同。因此,在一个代码中,如果我采用加密值并尝试在另一个代码中对其进行解密,则会出现错误。当我从 iOS 转到节点时,我收到此错误:
错误:数字信封例程:EVP_DecryptFinal_ex:错误的最终块长度代码:解密('vfOzya0yV9G5hLHeSh3R1g==');
我还得到了字符串“Hello World”的这些不同的加密值:
IOS: vfOzya0yV9G5hLHeSh3R1g==
NODE: 13b51a6785f47d8601c3a612d41b9a8b
我该如何解决这个问题,以便我可以互操作我的 iOS 和 Node.js,以及未来的 Android。我知道我的散列算法适用于生成 SHA256 和 PBDKF2,因为我得到了相同的散列和密钥。这意味着在加密我的密码时,我的实现对于 AES128 是错误的。很可能是我的 iOS 代码。请让我知道我的错误在哪里。
【问题讨论】:
-
抱歉,有点新,所以我只是假设编辑我的问题的人知道他或她在做什么。
-
对于初学者来说:
13b51a6785f47d8601c3a612d41b9a8b是十六进制编码,vfOzya0yV9G5hLHeSh3R1g==是 Base64 编码,解码为十六进制是:bdf3b3c9ad3257d1b984b1de4a1dd1d6- 仍然不相等。您需要在每个步骤中对每个执行十六进制转储以确定差异发生的位置。当您使用来自其他来源的代码时,它会成为您的代码,您有责任使其工作。可以潜入和调试。 -
@zaph 我应该包括归属地。我忽略了这一点,因为我的代码略有不同,因为它使用加密模块和 CryptoJS 的方式略有不同。无论如何,我会确保下次这样做,所以感谢您指出这一点。但至于你的第一条评论,我相信我有理由提出一个新问题,因为第一个问题是关于我的安全影响。这个问题是关于缺乏互操作性的。
标签: javascript objective-c node.js encryption aes