問題:
隨手分享一下好了,這個問題困擾了很久。
cryptico.js這個加密算法庫很全,很適合在前端用到各種加密解密算法的需求。但是美中不足的是,它的RSA加密不支持PEM格式,所以如果你後端用java或者python生成的公鑰不能直接用PEM的base64格式傳給前端進行加密。
解決辦法:
解決辦法就是在後端提取出來n
和e
這兩個數,轉成16進制之後傳給前端,然後人爲修改cryptico的兩個函數:
var publicKeyFromString = function (string) {
var tokens = string.split("|");
var N = tokens[0];
console.log(N);
var E = tokens.length > 1 ? tokens[1] : "03";
var rsa = new RSAKey();
rsa.setPublic(N, E);
return rsa
};
cryptico.encrypt = function (plaintext, publickeystring, signingkey) {
var cipherblock = "";
try {
var publickey = publicKeyFromString(publickeystring);
cipherblock += cryptico.b16to64(publickey.encrypt(plaintext));
}
catch (err) {
return {status: "Invalid public key"+" "+err};
}
return {status: "success", cipher: cipherblock};
};
使用的時候這樣使用:將n
和e
用|
分隔作爲publicKeyString
var publicKey = "{{n}}|{{e}}";
var encrypted = cryptico.encrypt("plaintext", publicKey);
console.log(encrypted.cipher);`
後話:
當然了,這裏的encrypt
函數修改的有點太粗暴了,還漏了signingkey
參數處理的部分,讀者自己參考cryptico.js
源碼改吧!
參考鏈接:
cryptico.js Github開源地址:
https://github.com/wwwtyro/cryptico
StackOverflow 解決方法:
http://stackoverflow.com/questions/16505963/encrypt-with-cryptico-js-decrypt-with-openssl