2

PBKDF2 の結果は、CryptoJS と iOS で異なります。

これが私のコードです

CryptoJS

var key= CryptoJS.PBKDF2("gf8uny", "2mnfpLsa+5I=", { keySize: 256/32, iterations: 1000 });
console.log(key.toString(CryptoJS.enc.Base64));
// console output ANepH98DqZHtMkkVrIk/CNmfykVPfEFpoax2PF8z5k8=  

iOS

NSMutableData *key = [NSMutableData dataWithLength:kCCKeySizeAES256];

NSString *password = @"gf8uny";
NSData*salt =[NSData dataFromBase64String:@"2mnfpLsa+5I="];

int result = CCKeyDerivationPBKDF(kCCPBKDF2,         // algorithm
                                  password.UTF8String,                // password
                                  password.length,                    // passwordLength
                                  salt.bytes,                         // salt
                                  salt.length,                        // saltLen
                                  kCCPRFHmacAlgSHA1,                              // PRF
                                  1000,                 // rounds
                                  key.mutableBytes,            // derivedKey
                                  key.length);                 // derivedKeyLen

NSString *sKey= [key base64EncodedString];
NSLog(@"key%@", sKey);
// output AjHjVAwHCpF1SnNDN6ri9ms7ig88VFBPwRVRMppBgnU=

誰か助けてくれませんか?私が間違っていることは何ですか?

ありがとう

4

1 に答える 1

0

コードの JavaScript バージョンでは、ソルトは JavaScript 文字列ではなく WordArray オブジェクトである必要があります。基本的に、2 つの例では、塩が異なるため、2 つの異なる結果が得られます。

私が話していることを確認するには、ブラウザの JavaScript コンソールで次のコードを試してください。

saltWArray = CryptoJS.lib.WordArray.random(128/8);
saltString = saltWArray.toString(); // same salt but in String format

var key1 = CryptoJS.PBKDF2("password", saltWArray, { keySize: 512/32, iterations: 300 });
var key2 = CryptoJS.PBKDF2("password", saltString, { keySize: 512/32, iterations: 300 });

上記のコードでは、ソルトの内容が同じであってもソルトが本質的に異なるため、key1 と key2 は異なります。

于 2013-10-18T20:36:08.183 に答える