2011-12-22 163 views
1

我需要制定出一個加密/解密算法,但我很困惑關於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

+0

我正在努力研究fwknop中的算法是如何工作的,但不幸的是我一直不成功。 – 2012-01-09 08:25:06

回答

1
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]; 

我想在你的代碼的第二塊要複製的數據錯誤。試試這個:

unsigned char data[128-16]; // remove the Salted__ and the 8 character salt 
[test getBytes:data range:NSMakeRange(16, 128-16)]; 
test = [NSData dataWithBytes:data length:128-16]; 

你的評論表明你想要跳過Salted__和鹽本身。

請注意,我沒有得到鹽應該去哪裏的線索 - 這取決於您正在嘗試整合的協議 - 所以我希望你已經從另一個來源獲得了很好的記錄。

+0

你知道UTF8 vs ASCII可能如何影響輸出嗎?查看我發現的一些代碼的更新問題。 – 2011-12-22 13:50:38

+1

到目前爲止,UTF-8在這個問題中沒有任何作用,因爲所寫的所有字符在兩種編碼中都是相同的。只有當你向用戶顯示輸出時,他們纔會有所作爲,即使如此,ASCII和UTF-8的所有共同字符看起來都不錯。我想最有可能你只是檢查錯誤的字節。你試過我建議的替換代碼嗎?至於Perl,我發現這是一種只寫語言。幾周之後,我甚至無法讀取我的_own_ Perl代碼。抱歉。 :) – sarnold 2011-12-23 23:50:36