13

JavascriptまたはJqueryでこれを行う方法は?

2段階で提案してください:

1.- ワード配列からシングルバイト配列へ。

2.- バイト配列から文字列へ。

多分これは助けることができます:

function hex2a(hex) {
    var str = '';
    for (var i = 0; i < hex.length; i += 2)
        str += String.fromCharCode(parseInt(hex.substr(i, 2), 16));
    return str;
}
4

1 に答える 1

25

あなたが達成しようとしていることは、すでに CryptoJS に実装されています。ドキュメントから:

toString メソッドを明示的に呼び出してエンコーダーを渡すことにより、WordArray オブジェクトを他の形式に変換できます。

var hash = CryptoJS.SHA256("Message");
alert(hash.toString(CryptoJS.enc.Base64));
alert(hash.toString(CryptoJS.enc.Hex));


正直なところ、なぜ自分でそれを実装したいのかわかりません...しかし、あなたが言及した2つのステップで「手動で」それを絶対に行う必要がある場合は、次のようなことを試すことができます:

function wordToByteArray(wordArray) {
    var byteArray = [], word, i, j;
    for (i = 0; i < wordArray.length; ++i) {
        word = wordArray[i];
        for (j = 3; j >= 0; --j) {
            byteArray.push((word >> 8 * j) & 0xFF);
        }
    }
    return byteArray;
}

function byteArrayToString(byteArray) {
    var str = "", i;
    for (i = 0; i < byteArray.length; ++i) {
        str += escape(String.fromCharCode(byteArray[i]));
    }
    return str;
}

var hash = CryptoJS.SHA256("Message");
var byteArray = wordToByteArray(hash.words);
alert(byteArrayToString(byteArray));

関数は完全にwordToByteArray機能するはずですがbyteArrayToString、ほとんどの場合、奇妙な結果が生じることに注意してください。エンコーディングについてはよくわかりませんが、ASCII は 7 ビットしか使用しないため、バイト全体をエンコードしようとしても ASCII 文字を取得できません。escapeそのため、少なくとも取得する可能性のあるすべての奇妙な文字を表示できるように機能を追加しました。;)

分析には、CryptoJS が既に実装している関数を使用するか、(文字列に変換せずに) バイト配列を使用することをお勧めします。

于 2012-08-09T23:24:45.957 に答える