動的QRCodeのデータペイロードを暗号化しようとしています。出力長と同じ入力長でQRCodeペイロードを暗号化します
私たちは動的データからQRコードを生成するアプリを持っており、必要に応じてペイロードを暗号化するオプションが必要です。
はQRCodesに固有のサイズ制限のため、要件の1つは、ペイロードデータが暗号化データと同じサイズでなければならないことです。暗号化されたデータが異なる/大きすぎると、QRCodeが正しくスキャン/デコードできないことがあります。
私は、他の場所で提案されているように、CTRモード(ブロックとは対照的にストリーム)でAES暗号化を使用しようとしました。その結果、出力暗号バイトは入力バイトと同じサイズになりますが、バイトをcharフレンドリ形式(たとえばbase64)に変換すると元のペイロードよりもはるかに長い文字列長が生成されます。
プレーンテキストと暗号化された文字列の長さが同じになるように文字列を暗号化する方法はありますか?
ここにあるhttps://courses.csail.mit.edu/6.857/2014/files/12-peng-sanabria-wu-zhu-qr-codes.pdfにあるこのMIT pdfによれば、彼らはSEQR(Symmetric Encrypted QR)コードと呼ばれる既存のソリューションを挙げています。しかし、私はまだ記事で述べたように、同じ長さのプレーンテキスト入力が暗号化された出力を生成する解決策を見つけることはできません。
私たちはバックエンドでC#.NET、フロントエンドにZXing QRCodeライブラリとJavascript、CryptoJSを使用しています。
また、CTRモードでAESをデモストするJSFiddleも作成しました。
http://jsfiddle.net/s1jeweja/5/
var options = { mode: CryptoJS.mode.CTR, padding: CryptoJS.pad.NoPadding };
/*** encrypt */
var json = CryptoJS.AES.encrypt("some plain text", "secret", options);
var ciphertext = json.ciphertext.toString(CryptoJS.enc.UTF8);
document.getElementById("id2").innerHTML = ciphertext;
//debugger;
/*** decrypt */
var decrypted = CryptoJS.AES.decrypt(json, "secret", options);
var plaintext = decrypted.toString(CryptoJS.enc.Utf8);
document.getElementById("decrypt").innerHTML = plaintext; // text can be a random lenght
QRコードは、生のバイナリデータを搬送する困難はありません。平文と正確に同じサイズのペイロードを暗号化するのが本当に安全かどうかを検討するべきだとも思います。たとえば、あなたのシステムが[再生攻撃](https://en.wikipedia.org/wiki/Replay_attack)に対して脆弱であることが重要ですか? –
私は、ペイロードをバイナリとして格納することはオプションではないという印象を受けていましたが、私はこれを再訪します。 あなたは脆弱性のリスクについては正しいですか。コンテキスト:私たちは、個人情報をQRコードに保存し、イベント用に印刷しています。他の出席者が出席者の許可なく出席者情報を収集するのを防ぐことが重要です。誰かが何らかの形ですべての出席者の物理的なQRコードを収集してから脆弱性を利用すると、この種の情報を簡単に収穫できる方法があると思います。私はそれが受け入れられるリスクだと思うでしょう – gorillapower