有没有人有好运加密任何JavaScript库的外国字符?
我正在使用jCryption v.1.4库(RSA算法)加密外来字符。 看起来这个库与外来字符不兼容(我使用的是cp1251)。 加密适用于ASCII /英文字符,但在解密外来字符后我会出现乱码。
我认为问题来自于jCryption将char字符串转换为字节的方式。 它仅将char转换为8位,并将& 2的char转移到一起。外国人占据>肯定是8位。
任何想法都将不胜感激! 德米特里
答案 0 :(得分:1)
您可以先尝试对邮件进行base64编码,然后再进行加密。这将确保输入只有ascii字符。
所以你的算法可能就像这个伪代码。
Encryption
input = "text";
input = base64Encode(input); //there's lots of implementations of this online
cipher = encodeWithJcrypt(input);
Decryption
text = decodeWithJcrypt(cipher);
text = base64Decode(text);
答案 1 :(得分:1)
这是16位Unicode字符(javascript)的base64编码:
var Base64 = {}; // Base64 namespace
Base64.code = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
Base64.encode = function(str) {
var o1, o2, bits, h1, h2, h3, h4, h5, d6, e=[], pad = '', c, plain, coded;
var b64 = Base64.code;
plain = str;
c = plain.length % 2; // pad string to length of multiple of 3
if (c > 0) { while (c++ < 2) { pad += '==='; plain += '\0'; } }
for (c=0; c<plain.length; c+=2) { // pack 2 hexadecets into 6 hexets
o1 = plain.charCodeAt(c);
o2 = plain.charCodeAt(c+1);
bits = o1<<16 | o2;
h1 = bits>>26 & 0x3f;
h2 = bits>>20 & 0x3f;
h3 = bits>>14 & 0x3f;
h4 = bits>>8 & 0x3f;
h5 = bits>>2 & 0x3f;
d6 = bits & 0x3;
// use hextets to index into code string
e[c/2] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4)
+ b64.charAt(h5) + b64.charAt(d6);
}
coded = e.join(''); // join() is far faster than repeated string concatenation in IE
// replace 'A's from padded nulls with '='s
coded = coded.slice(0, coded.length-pad.length) + pad;
return coded;
}
这是16位unicode字符(java)的base64解码:
private static String BASE64_CODE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
private String decodeBase64(String b64Str) {
try {
String decodedBase64 = "";
for (int c = 0, b=0; c < b64Str.length(); c+=6, b+=4) {
// unpack 5 hexets and 2-bit into 4 octets
int h1 = BASE64_CODE.indexOf(b64Str.charAt(c));
int h2 = BASE64_CODE.indexOf(b64Str.charAt(c + 1));
int h3 = BASE64_CODE.indexOf(b64Str.charAt(c + 2));
int h4 = BASE64_CODE.indexOf(b64Str.charAt(c + 3));
int h5 = BASE64_CODE.indexOf(b64Str.charAt(c + 4));
int d6 = BASE64_CODE.indexOf(b64Str.charAt(c + 5));
int bits = h1<<26 | h2<<20 | h3<<14 | h4<<8 | h5<<2 | (d6 & 0x3);
byte o1 = (byte) (bits>>>24 & 0xff);
byte o2 = (byte) (bits>>>16 & 0xff);
byte o3 = (byte) (bits>>>8 & 0xff);
byte o4 = (byte) (bits & 0xff);
String partialDecodedStr = new String(new byte[] {o1, o2}, "UTF-16");
//take care of padding
// - if BASE64_CODE.indexOf(b64Str.charAt(c + 3)) == 64 OR b64Str.charAt(c + 3) == '='
if (h4 == 0x40) {
//This 16-bit char was padding: get rid of it
}
else
partialDecodedStr = partialDecodedStr.concat(new String(new byte[] {o3, o4}, "UTF-16"));
decodedBase64 = decodedBase64.concat( partialDecodedStr);
}
return decodedBase64;
}
catch (UnsupportedEncodingException e) {
//TODO log4j
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
throw new RuntimeException("Unable to decode base64.");
}
}