次のようなカスタム パスフレーズを使用して一部のデータを暗号化するために、 MSDNEncryptStringToBytes_Aes
のメソッドを使用しています。
string original = "some data to encrypt";
byte[] encrypted;
using (AesManaged aes = new AesManaged())
{
// Prepare new Key and IV.
string passphrase = "somepassphrase";
byte[] saltArray = Encoding.ASCII.GetBytes("somesalt");
Rfc2898DeriveBytes rfcKey = new Rfc2898DeriveBytes(passphrase, saltArray);
aes.Key = rfcKey.GetBytes(aes.KeySize / 8);
aes.IV = rfcKey.GetBytes(aes.BlockSize / 8);
// Encrypt the string to an array of bytes.
encrypted = EncryptStringToBytes_Aes(original, aes.Key, aes.IV);
// Decrypt the bytes to a string.
string roundtrip = DecryptStringFromBytes_Aes(encrypted, aes.Key, aes.IV);
return Convert.ToBase64String(encrypted);
}
そしてそれは機能します(DecryptStringFromBytes_Aes
元の文字列を返します)。
私の質問はencrypted
、クライアント側にも同じパスフレーズがある場合、JavaScript を使用して復号化するにはどうすればよいですか? CryptoJSを使用して解読しようとしましたが、成功しませんでした。データはWebサービスで暗号化され、バイト配列、文字列としてJSに渡そうとしましたが、さまざまなエンコーディングでエンコードしようとしましたが、何をしても元の文字列を取得できませんでした。ここで何が間違っていますか?どうすればこれを機能させることができますか? このように実行可能ですか?saltArray エンコーディングまたはカスタム パスフレーズの使用が問題の原因になる可能性はありますか?
たとえば、私の JS 試行の 1 つ (base64 エンコーディングを使用) を次に示します。
var decoded = CryptoJS.enc.Base64.parse(encrypted);
var decrypted = CryptoJS.AES.decrypt(decoded, "somepassphrase");
(編集:後でランダムソルトを実装するつもりでした。他のすべてが機能したら、その方法で何が起こっているかを追跡する方が簡単です)