2011-12-22 13 views
1

に関する混乱私は復号/暗号化アルゴリズムをうまくする必要がありますが、私は混乱している/ IVなどSHA256/CBC /塩に関する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 

任意のアイデア:私は次のことを試してみましたか?

EDIT:詳細:これは実装しようとしているコードに関連しています。ここで

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のアルゴリズムがどのように機能しているかを試していましたが、残念ながら失敗しました。 –

答えて

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

私は、コードの2番目のブロックに間違ったデータをコピーしていると思います。これを試してください:

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とASCIIの違いが出力に与える影響を知っていますか?私が見つけたコードの更新された質問を見てください。 –

+1

これまでのところ、UTF-8は質問には何の役割も果たしていません。書いたように、あなたが含めたすべての文字は両方のエンコードで同じです。彼らはあなたが出力をユーザーに見せてもらうときにだけ違いがあり、それでもASCIIとUTF-8の両方の共通の文字はうまく見えます。私は間違ったバイトを調べている可能性が高いと思います。私の推奨代替コードを試しましたか? Perlに関しては、私は書き込み専用の言語であることがわかります。私は数週間後に私の_own_Perlコードを読んでも困惑しました。ごめんなさい。 :) – sarnold

関連する問題