如何使用 crypto-js 将加密输出的二进制数据保存到文件中?
How to use crypto-js to save the binary data, of an encryption-output, to a file?
我正在尝试帮助移动开发人员加密图像并将其上传到 Azure blob 存储。移动应用程序使用 expo 和 crypto js。我对 mobile dev 或 expo 不是很熟悉,但看起来 expo 可以让你访问图像的 base64 编码版本。
我的目标是使用 crypto js 加密该图像数据,并将其上传到 Azure blob 存储。
expo 或 Azure 的细节对我的问题来说并不是那么重要,但我认为它们值得一提。我认为重要的是我正在使用加密 js 来 AES 加密该图像数据。
我从图像数据的 base64 字符串开始,所以我使用 crypto js 来解析它,如下所示...
const words = CryptoES.enc.Base64.parse(data);
这给了我一个代表图像数据的 WordArray
,我想(来自移动设备 API 给我的 base64 字符串)。
接下来我可以像这样加密图像数据...
const encrypted = CryptoES.AES.encrypt(words, AES_KEY, { iv: AES_IV });
现在我有了加密数据,我想以二进制十六进制格式或其他格式将其写入文件。我不想要文件中的 base64 文本,也不想要文件中的十六进制字符串 - 我希望它包含字节的文字加密数据字节。
我不确定如何获取这些数据。
我猜它只是“toString”,但当我这样做时它说无效 utf8
。这是正在处理的JPG文件。
如何获取实际的字节数据并将其写入带有加密 js 的文件?
CryptoJS.AES.encrypt()
returns 一个 CipherParams
对象,其中将密文封装为 WordArray
。一种可能性是使用自定义方法将此 WordArray
转换为 Uint8Array
。在以下代码中,此转换由 convertWordArrayToUint8Array()
:
完成
function convertWordArrayToUint8Array(wordArray) {
var arrayOfWords = wordArray.hasOwnProperty("words") ? wordArray.words : [];
var length = wordArray.hasOwnProperty("sigBytes") ? wordArray.sigBytes : arrayOfWords.length * 4;
var uInt8Array = new Uint8Array(length), index=0, word, i;
for (i=0; i<length; i++) {
word = arrayOfWords[i];
uInt8Array[index++] = word >> 24;
uInt8Array[index++] = (word >> 16) & 0xff;
uInt8Array[index++] = (word >> 8) & 0xff;
uInt8Array[index++] = word & 0xff;
}
return uInt8Array;
}
var AES_KEY = CryptoJS.enc.Utf8.parse('0123456789012345');
var AES_IV = CryptoJS.enc.Utf8.parse('5432109876543210');
var plaintext = 'The quick brown fox jumps over the lazy dog';
var ciphertextCP = CryptoJS.AES.encrypt(plaintext, AES_KEY, { iv: AES_IV }); // CipherParams object
var ciphertextWA = ciphertextCP.ciphertext; // WordArray
var ciphertextArr = convertWordArrayToUint8Array(ciphertextWA); // Uint8Array
这个 Uint8Array
现在可以存储在文件中,例如有:
var fileName = "encdata.bin";
saveByteArray([ciphertextArr], fileName);
使用 here 中的 saveByteArray()
。
另一种方法是使用 Latin1 encoder:
将 WordArray
转换为二进制字符串
var ciphertextBinStr = ciphertextWA.toString(CryptoJS.enc.Latin1);
然后可以很容易地转换为 Uint8Array
,例如有:
function str2Uint8Array(str) {
const arr = new Uint8Array(new ArrayBuffer(str.length));
for (let i = 0, strLen = str.length; i < strLen; i++)
arr[i] = str.charCodeAt(i);
return arr;
}
var ciphertextArr = str2Uint8Array(ciphertextBinStr);
我正在尝试帮助移动开发人员加密图像并将其上传到 Azure blob 存储。移动应用程序使用 expo 和 crypto js。我对 mobile dev 或 expo 不是很熟悉,但看起来 expo 可以让你访问图像的 base64 编码版本。
我的目标是使用 crypto js 加密该图像数据,并将其上传到 Azure blob 存储。
expo 或 Azure 的细节对我的问题来说并不是那么重要,但我认为它们值得一提。我认为重要的是我正在使用加密 js 来 AES 加密该图像数据。
我从图像数据的 base64 字符串开始,所以我使用 crypto js 来解析它,如下所示...
const words = CryptoES.enc.Base64.parse(data);
这给了我一个代表图像数据的 WordArray
,我想(来自移动设备 API 给我的 base64 字符串)。
接下来我可以像这样加密图像数据...
const encrypted = CryptoES.AES.encrypt(words, AES_KEY, { iv: AES_IV });
现在我有了加密数据,我想以二进制十六进制格式或其他格式将其写入文件。我不想要文件中的 base64 文本,也不想要文件中的十六进制字符串 - 我希望它包含字节的文字加密数据字节。
我不确定如何获取这些数据。
我猜它只是“toString”,但当我这样做时它说无效 utf8
。这是正在处理的JPG文件。
如何获取实际的字节数据并将其写入带有加密 js 的文件?
CryptoJS.AES.encrypt()
returns 一个 CipherParams
对象,其中将密文封装为 WordArray
。一种可能性是使用自定义方法将此 WordArray
转换为 Uint8Array
。在以下代码中,此转换由 convertWordArrayToUint8Array()
:
function convertWordArrayToUint8Array(wordArray) {
var arrayOfWords = wordArray.hasOwnProperty("words") ? wordArray.words : [];
var length = wordArray.hasOwnProperty("sigBytes") ? wordArray.sigBytes : arrayOfWords.length * 4;
var uInt8Array = new Uint8Array(length), index=0, word, i;
for (i=0; i<length; i++) {
word = arrayOfWords[i];
uInt8Array[index++] = word >> 24;
uInt8Array[index++] = (word >> 16) & 0xff;
uInt8Array[index++] = (word >> 8) & 0xff;
uInt8Array[index++] = word & 0xff;
}
return uInt8Array;
}
var AES_KEY = CryptoJS.enc.Utf8.parse('0123456789012345');
var AES_IV = CryptoJS.enc.Utf8.parse('5432109876543210');
var plaintext = 'The quick brown fox jumps over the lazy dog';
var ciphertextCP = CryptoJS.AES.encrypt(plaintext, AES_KEY, { iv: AES_IV }); // CipherParams object
var ciphertextWA = ciphertextCP.ciphertext; // WordArray
var ciphertextArr = convertWordArrayToUint8Array(ciphertextWA); // Uint8Array
这个 Uint8Array
现在可以存储在文件中,例如有:
var fileName = "encdata.bin";
saveByteArray([ciphertextArr], fileName);
使用 here 中的 saveByteArray()
。
另一种方法是使用 Latin1 encoder:
将WordArray
转换为二进制字符串
var ciphertextBinStr = ciphertextWA.toString(CryptoJS.enc.Latin1);
然后可以很容易地转换为 Uint8Array
,例如有:
function str2Uint8Array(str) {
const arr = new Uint8Array(new ArrayBuffer(str.length));
for (let i = 0, strLen = str.length; i < strLen; i++)
arr[i] = str.charCodeAt(i);
return arr;
}
var ciphertextArr = str2Uint8Array(ciphertextBinStr);