我需要制定出一個加密/解密算法,但我很困惑關於SHA256/CBC /鹽/ IV等關於Rijndael算法/ SHA256加密混淆
正確加密的字符串的一個例子是:
U2FsdGVkX19IfIZtJ/48wk8z3ZRGDK8RD8agyQRhMrsOMsoIlVEcrzraOLo5IRBXjDkN1JUFnNrkvi2NA22IOTv00U97065tUNBQKEVXcaL0UJirtcqHlq8lN4pEm14ZokKXv8mUP8GkUKrOf37GhOugi/F/CQiILb57kIPrYPk=
它是Base64編碼,然後Rijndael編碼。前8個字符是'Salted__',接下來我假設的8個字符是某種鹽(隨機生成)。
我提供的加密這個數據的密鑰是'12345678'。
該解密的數據應該是:
2358442189442905:ZGF2aWQ =:1324515293:1.9.12:1:MC4wLjAuMCxub25lLzA =:LfcTMMYyUcwgL8keu3sMoNC/PFEKZy8fWFvo3rJvSdo
顯然它是以下隱窩:: CBC :: VERSION 2.29
我似乎無法解密上面正確加密的字符串。我試過以下內容:
NSString *key = @"12345678";
NSData *test = [NSData dataFromBase64String:@"U2FsdGVkX19IfIZtJ/48wk8z3ZRGDK8RD8agyQRhMrsOMsoIlVEcrzraOLo5IRBXjDkN1JUFnNrkvi2NA22IOTv00U97065tUNBQKEVXcaL0UJirtcqHlq8lN4pEm14ZokKXv8mUP8GkUKrOf37GhOugi/F/CQiILb57kIPrYPk="];
unsigned char salt[8]; //get the salt out
[test getBytes:salt range:NSMakeRange(8, 8)];
NSData *saltData = [NSData dataWithBytes:salt length:8];
unsigned char data[128-16]; // remove the Salted__ and the 8 character salt
[test getBytes:data range:NSMakeRange(8, 128-8)];
test = [NSData dataWithBytes:data length:128-8];
NSMutableData *aeskey = [NSMutableData dataWithData:[key dataUsingEncoding:NSUTF8StringEncoding]];
[aeskey appendData:saltData]; // add the salt to the end of the key?
NSData *test2 = [test decryptedAES256DataUsingKey:key error:nil]; //Using a NSData+CommonCrypto library
關於如何正確解密的想法?
編輯:更多信息:這是代碼相關的,我想實現。
elsif ($header_mode eq 'salt') {
$self->{salt} = $self->_get_random_bytes(8) if $self->{make_random_salt};
defined (my $salt = $self->{salt}) or croak "No header_mode of 'salt' specified, but no salt value provided"; # shouldn't happen
length($salt) == 8 or croak "Salt must be exactly 8 bytes long";
my ($key,$iv) = $self->_salted_key_and_iv($self->{passphrase},$salt);
$self->{key} = $key;
$self->{civ} = $self->{iv} = $iv;
$result = "Salted__${salt}";
}
my $self = shift;
my ($pass,$salt) = @_;
croak "Salt must be 8 bytes long" unless length $salt == 8;
my $key_len = $self->{keysize};
my $iv_len = $self->{blocksize};
my $desired_len = $key_len+$iv_len;
my $data = '';
my $d = '';
while (length $data < $desired_len) {
$d = md5($d . $pass . $salt);
$data .= $d;
}
return (substr($data,0,$key_len),substr($data,$key_len,$iv_len));
這裏是我不完全理解的實現:http://pastebin.com/R0b1Z7GH http://pastebin.com/aYWFXesP
我正在努力研究fwknop中的算法是如何工作的,但不幸的是我一直不成功。 – 2012-01-09 08:25:06