我試圖加密動態QRCode的數據淨荷。加密輸入長度與輸出長度相同的QRCode淨荷
我們有一個從動態數據生成QRCode的應用程序,如果需要,我們希望有一個選項來加密有效負載。
由於QRCodes固有的尺寸限制,的要求之一是,有效載荷數據的大小必須爲加密數據相同。如果加密數據不同/太大,QRCode可能無法正確掃描/解碼。
我試圖在CTR模式下使用AES加密(流而不是塊),如其他地方所建議的。結果是輸出密碼字節與輸入字節大小相同,但是將字節轉換爲字符友好格式(例如base64)會產生比原始有效負載長得多的字符串長度。
有沒有辦法加密一個字符串,使純文本和加密的字符串長度是相同的?
根據這裏的MIT pdf,https://courses.csail.mit.edu/6.857/2014/files/12-peng-sanabria-wu-zhu-qr-codes.pdf,他們提到了已經存在的解決方案,他們稱之爲SEQR(對稱加密QR)代碼。但是,我仍然沒有找到一個解決方案,正如文章中提到的那樣,該解決方案生成的加密輸出與純文本輸入的長度相同。
我們在後端使用C#.NET,ZXing QRCode庫和我們前端的Javascript,使用CryptoJS。
我還創建了一個JSFiddle,在CTR模式下展示了AES。
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碼沒有攜帶原始二進制數據的困難,因此對於「CHAR友好的」有效載荷的要求似乎武斷和適得其反。我也認爲你應該考慮是否真的安全地加密了與明文完全相同大小的有效載荷。例如,你的系統是否容易受到[重放攻擊](https://en.wikipedia.org/wiki/Replay_attack)的影響? –
我的印象是,將有效載荷存儲爲二進制不是一種選擇,我會重新考慮這一點。 你是對的漏洞風險。背景:我們正在將個人信息存儲在QRCode中並將其打印爲一個事件。它更多的是阻止其他參與者在未經他們許可的情況下收集參與者信息。如果有人以某種方式收集所有與會者的實體QRCodes並利用漏洞,我會認爲將有更簡單的方法來收集這類信息?我認爲這是一個可以接受的風險 – gorillapower