最近、シミュレーション後のログイン関数を作成しました。ログインパスワードはCryptoJS aesで暗号化され、対応するアルゴリズムをC#で書きたいと思っています AES暗号化アルゴリズムの紹介:
高度暗号化標準(略称:AES)は、暗号技術ではラインダール暗号とも呼ばれ、アメリカ連邦政府が採用したブロック暗号化の標準です。 この標準は元のDESに代わるものとして使われ、世界中で分析され広く利用されています。 5年間の選定プロセスを経て、高度暗号標準は2001年11月26日に国立標準技術研究所(NIST)によってFIPS PUB 197として公開され、2002年5月26日に有効な標準となりました。 2006年には、高度暗号標準(Advanced Encryption Standard)が対称鍵暗号の最も人気のあるアルゴリズムの一つとなりました。 jsアルゴリズムは以下の通りです:
インターネット上でAES暗号化のウェブサイトを検索しましたが、結果は自分の暗号化とは異なっていました。AESには多くのモードがあり、インターネットで他の人の紹介も見たことがあります
まずは平文とキーを準備します: var plaintText = 'aaaa プレーンテキスト var keyStr = 'bbbbbbbb'; 一般的に、キーは文字列です 公式ウェブサイトのドキュメントによると、AES方式はAES-128、AES-192、AES-256をサポートしており、暗号化プロセスで使用される暗号化方法は受信鍵の種類に依存します。そうでなければAES-256に従って暗号化されます。 CryptoJSはAES-128、AES-192、AES-256をサポートしています。 渡す鍵のサイズでバリアントを選びます。 パスフレーズを使うと、256ビットのキーが生成されます。 Javaは128ビットで与えられていますが、文字列なのでフロントエンドで128ビットに変換する必要があります。 最初は、CryptoJS.enc.Hex.parseを使えば正しく128ビットの鍵に変換できると思っていました。 でもそれ以外は... 何度も試した後、CryptoJS.enc.Utf8.parseメソッドを使って鍵を128ビットに変換する必要があります。 複数回の試みがあると言われているので、その理由は不明であり、後ほどさらに深く研究される予定です。 文字列タイプのキーを使う前に、uft8で解析する必要があります var key = CryptoJS.enc.Utf8.parse(keyStr); バックエンドはPKCS5Paddingを使っていますが、CryptoJSを使うとオフセットが全くないことが判明しました。 暗号化 var encryptedData = CryptoJS.AES.encrypt(plaintText, key, { モード:CryptoJS.mode.ECB, パディング:CryptoJS.pad.Pkcs7 }); CryptoJSで生成される暗号文はオブジェクトなので、それを直接文字列に変換するとBase64エンコードとなり、encryptedData.ciphertextの属性はバックエンドで求められる文字列形式に変換されます。 var encryptedBase64Str = encryptedData.toString(); 出力: 'RJcecVhTqCHHnlibzTypzuDvG8kjWC+ot8JuxWVdLgY=' console.log(encryptedBase64Str); Javaと同じ暗号文を取得するには、encryptedDataでciphertext.toString()を読む必要があります var encryptedStr = encryptedData.ciphertext.toString(); 出力: '44971e715853a821c79e589bcd3ca9cee0ef1bc923582fa8b7c26ec5655d2e06' console.log(encryptedStr); 暗号化された暗号文は128ビット文字列であるため、復号時にBase64エンコード形式に変換する必要があります。 次に、CryptoJS.enc.Hex.parseメソッドで16進数に変換し、CryptoJS.enc.Base64.stringifyでBase64エンコードされた文字列に変換し、最後にCryptoJS.AES.decryptメソッドに渡して復号します。 文字列タイプの暗号文を取得するには、まずHexメソッドで解析する必要があります var encryptedHexStr = CryptoJS.enc.Hex.parse(encryptedStr); 暗号文をBase64文字列に変換する 復号できるのはBase64型の文字列暗号文だけです var encryptedBase64Str = CryptoJS.enc.Base64.stringify(encryptedHexStr); Base64エンコードに変換された文字列は、復号操作のためにCryptoJS.AES.decryptメソッドに渡すことができます。 復号化 var decryptedData = CryptoJS.AES.decrypt(encryptedBase64Str, key, { モード:CryptoJS.mode.ECB, パディング:CryptoJS.pad.Pkcs7 }); CryptoJS復号後もオブジェクトのままで、平文に変換するにはUtf8形式の文字列に変換する必要があります。 復号後、平文文字列はUtf8のように転置する必要があります var decryptedStr = decryptedData.toString(CryptoJS.enc.Utf8); console.log(decryptedStr); 「あ
こちらがAESの.NET/C#実装のソースコードです:
|