2011-03-01 4 views
1

フォームからパスワードを取得し、RSAで暗号化してからJavaスクリプトでフォームを送信しようとしています。RSA復号化が逆戻りしています。Javascript - > perl

フォームがPerlコードで受信されると、パスワードを復号化します。私は、同じRSAキーを使用してJavaスクリプトとPerlを取得することができました。私はJavaスクリプトで暗号化されたメッセージを暗号化し、PerlでPerlで暗号化されたメッセージを復号化できます。

次のステップは、Javaスクリプトで暗号化し、Perlで復号化することです。私はほとんどそこだfrusteration多くの後、しかし、復号化された文字列は後方です:

Clear Text Here! 

はポスト Perlはその後、解読しようとすると、次の

������������������������������������������������ereh txet raelC 
を作成している経由で提出し、その後JavaScriptで暗号化されます

ご覧のとおり、それは逆です。奇妙な文字は、javascriptライブラリが0の文字列をパディングした結果です。

これはエンディアンと関連があると思われますが、これまでの私の実験ではgobbly-gookが作成されています。

私はperlパッケージCrypt :: OpenSSL :: RSAを使用しています。 そして、Dave Shapiroによって書かれたjavascript rsaと関連する数学ライブラリは、ここにあります:http://ohdave.com/rsa/

JavaScriptのRSAライブラリはバイナリの10進表現として値を返します。私はこれをCrypt :: OpenSSL :: Bignumオブジェクトに送り、perlコードをバイナリに変換して使用します。

暗号化コードは次のとおりです。

function doEncryption(key, ptextID, ctextID) { 
    $(ctextID).val("Encrypting..."); 
    $(ctextID).val(encryptedString(key, $(ptextID).val())); 
} 

と復号化コードです:

sub java_decrypt { 
    my $message = shift; 
    my $rsa = shift; 

    $rsa->use_no_padding(); 
    my @blocks = split ' ', $message; 
    my $decmessage = ""; 
    foreach my $block (@blocks) { 
     my $bitz = Crypt::OpenSSL::Bignum->new_from_decimal($block); 
     $decmessage .= $rsa->decrypt($bitz->to_bin()); 
    } 
    $rsa->use_pkcs1_oaep_padding(); 
    #$decmessage = reverse $decmessage; 
    #$decmessage =~ s/\0//g; 
    return($decmessage); 
} 

最後にコメントアウトの2行は、復号化が後方とパッド入りのもので問題を修正しますが、私はそれを信じているか分からない。 perlで暗号化されていれば、正しい方法で出てくるので、これを解決する良い方法があれば(バイナリ文字列のエンディアンを変える?)私はそれをもっと好むでしょう。

私はpackでendiannessを交換しようとしましたが、これは私にはちょっとばかげた報酬しか与えませんでした。そして、尋ねられた場合には、メッセージが現在1つの64byteブロックにあるので、復号されたメッセージの文字列連結は機能しません。

+0

これを行うことで何を達成しようとしていますか?パスワードを要求する攻撃者は、クライアントに送信するjavascriptを単純に変更して、パスワードをプレーンテキストで送信するか、またはキーを傍受して暗号化されたパスワードを読み取ることができます。 –

+1

RSA、私はjavascriptにキーの公開部分のみを与えることができます。したがって、それらを傍受すれば、サーバ上で安全な秘密鍵が必要なので、それらは役に立たなくなります。私は、攻撃者が送信を傍受できると仮定しています。私はどのように変更されたjavascriptからユーザーを保護するのか分からないが、彼らはパスワードを入力するようにキーログにJavaScriptを設定することができますので、クライアントコンピュータへの攻撃は常に動作します。それ以外の場合は、平文のパスワードの送信を常に推奨しています。何らかの保護が役に立たないため、私は同意しません。 –

答えて

1

このレベルでRSAと過度に複雑なことをやろうとするのではなく、sha256がTLS(SSL)経由でセッション全体を暗号化するような単純なハッシュアルゴリズムを使用しないようにする説得力のある理由がありますか?

また、私はJavascriptに精通していますが、10進数ではなく16進数の値を返していると確信しています。あなたはそれが小数であることを絶対に確信していますか?

+0

通常の状況下では正しいですが、パスワードをハッシュしてdecayptionで提出する方が良いでしょうが、クリアテキストパスワードだけを受け入れるLDAPシステムと合致させる必要があります。 –

+0

'var text = key.radix == 16? biToHex(crypt):biToString(crypt、key.radix); 'ソース 対 ' var text = key.radix == 16? biToDecimal(crypt):biToString(crypt、key.radix); 'Mine 興味深い!私のRSAライブラリはソースと競合します。ご覧のとおり、16進数で出力することがサポートされていますが、コードはbinToDecimalを呼び出します。著者のページでソースを確認しましたが、そうではありません。私は自分のソースを更新して何か変わったかどうかを見てみる –

関連する問題