我试图加密动态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