我在用着JSBN http://www-cs-students.stanford.edu/~tjw/jsbn/使用公钥/私钥对加密/解密数据。它非常适合文本数据,包括十六进制字符串。
我的问题是现在我有二进制数据,特别是加密JS https://code.google.com/p/crypto-js/字数组,我需要使用公钥加密并发送到另一个平台。
所以考虑一下:
var key = CryptoJS.lib.WordArray.random(256/8);
var rsa = new RSAKey();
rsa.setPublic(modulus, exponent);
var encrypted_key = rsa.encrypt(key.toString());
这是可行的,但它意味着“encrypted_key”实际上是一个已加密的十六进制字符串,而不是实际的密钥。我需要加密实际的密钥。
所以我在这里看到两个挑战:
1)我不是100%确定如何从CryptoJS.lib.WordArray中获取实际字节——尽管这似乎并不是完全不可克服的。
2)我不知道是否可以使用 JSBN 加密二进制数据。我很想知道如何去做。
有什么想法吗?
JSBN 库包含一个函数,即 pkcs1pad2(),它使用 JavaScript 的 charCodeAt() 函数将文本转换为数值。您将在第一个 while() 循环中看到该转换代码:
function pkcs1pad2(s,n) {
if(n < s.length + 11) { // TODO: fix for utf-8
alert("Message too long for RSA");
return null;
}
var ba = new Array();
var i = s.length - 1;
while(i >= 0 && n > 0) {
var c = s.charCodeAt(i--);
if(c < 128) { // encode using utf-8
ba[--n] = c;
}
else if((c > 127) && (c < 2048)) {
ba[--n] = (c & 63) | 128;
ba[--n] = (c >> 6) | 192;
}
else {
ba[--n] = (c & 63) | 128;
ba[--n] = ((c >> 6) & 63) | 128;
ba[--n] = (c >> 12) | 224;
}
}
ba[--n] = 0;
var rng = new SecureRandom();
var x = new Array();
while(n > 2) { // random non-zero pad
x[0] = 0;
while(x[0] == 0) rng.nextBytes(x);
ba[--n] = x[0];
}
ba[--n] = 2;
ba[--n] = 0;
return new BigInteger(ba);
}
如果您希望加密二进制数据,那么您可能必须修改此函数,以便它按照您想要的方式转换输入。
下面是 pkcs1pad2() 的示例,修改为接受十六进制字符串形式的二进制数据。如果您使用此版本的 pkcs1pad2(),那么您可以将 CryptoJS.lib.WordArray 转换为十六进制并将该十六进制字符串传递给 rsa.encrypt()。
function pkcs1pad2(hexPlaintext,n) {
if(n < hexPlaintext.length/2 + 11) {
alert("Message too long for RSA");
return null;
}
var ba = new Array();
var i = hexPlaintext.length;
while(i >= 2 && n > 0) {
ba[--n] = parseInt(hexPlaintext.slice(i-2,i),16);
i-=2;
}
ba[--n] = 0;
var rng = new SecureRandom();
var x = new Array();
while(n > 2) { // random non-zero pad
x[0] = 0;
while(x[0] == 0) rng.nextBytes(x);
ba[--n] = x[0];
}
ba[--n] = 2;
ba[--n] = 0;
return new BigInteger(ba);
}
或者,您可以修改它以直接获取 WordArray 并将其转换为 JSBN 使用的数组格式,但我将把它作为练习留给读者。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)