ここでJavaScriptでCBCモードで初期化ベクトルを出力する方法は?ここでは256ビットキーが使用されます。
var blockSizeInBits = 128;
var keySizeInBits = 256;
function rijndaelEncrypt(plaintext, key, mode) {
var expandedKey, i, aBlock;
var bpb = blockSizeInBits / 8; // bytes per block
var ct; // ciphertext
if (!plaintext || !key)
return;
if (key.length*8 != keySizeInBits)
return;
if (mode == "CBC") {
ct = getRandomBytes(bpb); // get IV
//dump("IV", byteArrayToHex(ct));
} else {
mode = "ECB";
ct = new Array();
}
function encrypt(block, expandedKey) {
var i;
if (!block || block.length*8 != blockSizeInBits)
return;
if (!expandedKey)
return;
block = packBytes(block);
addRoundKey(block, expandedKey);
for (i=1; i<Nr; i++)
Round(block, expandedKey.slice(Nb*i, Nb*(i+1)));
FinalRound(block, expandedKey.slice(Nb*Nr));
return unpackBytes(block);
}
function Encrypt_Text(plaintext, keystr) {
if (keystr.length == 0) {
alert("Please specify a key.");
return "";
}
if (plaintext.length == 0) {
alert("Nothing to encrypt!");
return "";
}
setKey(keystr);
addEntropyTime();
prng = new AESprng(keyFromEntropy());
var v = "";
for(var i=0; i<plaintext.length % 16; i++) //pad with null to blocks of 16bytes
plaintext += " ";
var ct = rijndaelEncrypt(plaintext, key, "CBC");
var hex_str = byteArrayToHex(ct);
var out_str = "";
hex_str = hex_str.split("");
for(var i=0; i<hex_str.length; i++) {
if(i % 64 == 0 && i > 0) out_str += "n";
out_str += hex_str[i];
}
delete prng;
return out_str;
}
ここで初期化ベクトルは暗号文の128ビットブロックまたは平文のランダムビットを表しますか?
回答:
回答№1は0一般的なIVソリューションの1つは、暗号化されたデータの先頭にIVを付けることです。秘密にする必要はありません。復号化では、IVを暗号化されたデータから分割し、復号化IVに使用できます。
ノート:
nullパディングを使用せず、代わりに使用することをお勧めします PKCS#7パディング。これは通常、ほとんどの実装のオプションであり、多くの場合デフォルトです。
テキストパスワードを直接使用せず、代わりに次のような方法を使用してテキストからパスワードを取得することをお勧めします PBKDF2。 PBKDF2の出力は、キーとIVの両方に分割するのに十分なバイトを生成するように指定できます。
ECBモード、安全ではありません、参照 ECBモード、ペンギンまでスクロールします。