RSA对称加密(JS加密,C#、Java解密)
清山博客
已于 2022-10-20 09:00:20 修改
567
收藏 3
分类专栏: C# JavaScript Java 文章标签: 服务器 运维
版权
C#
同时被 3 个专栏收录
147 篇文章2 订阅
订阅专栏
JavaScript
85 篇文章0 订阅
订阅专栏
Java
10 篇文章0 订阅
订阅专栏
目录
一、背景介绍
二、工作原理
三、实现步骤
(一)JS前端加密,.NET后端解密
1.生成RSA加密的公钥和私钥。
2.前端js加密。
3.C#解密
(二)JS前端加密,Java后端解密
1.前端js加密
2.Java解密
(三)辅助工具
一、背景介绍
常见的渗透测试会将网站登录时密码使用明文传输视为风险。推荐使用国密算法或者RSA算法对密码进行加密传输。
二、工作原理
前端js使用公钥进行加密,后端使用私钥进行解密(后端可以是C#或java语言)。
三、实现步骤
(一)JS前端加密,.NET后端解密
1.生成RSA加密的公钥和私钥。
使用.net自带的类就可以生成公钥和私钥(详见附件代码),比如我们使用以下公钥和私钥:
公钥(C#使用):
<RSAKeyValue><Modulus>0aeb0hFOWt+2hyKvaYP1Dr0F1Q7g/aWC5P8ebDRUMdHZPhD636u4AVOkQHY42jUt7xPbGuWRlQFAv6USrHtEw3nkFcRWz+4NCfaINonZtCu6+K/WNCJ/EH/OdyX4XDIDgJ7PNLspVbZDKRXwV4/aN+u/8LOwIyewJDd8uL8T/Zbebm/7ywqZ07V9G/pxXJ2PREy9ruMS6jmFd6j9YcE6Z6YnsBpo8n814nlGLLrk9igC9z1pLxE55cuO5Ma38sptNnx3SGzZvEwmsYq40Ry7OyfD7EUBP18yrmVs5c19BY1/7yZSlD9TorM6aHSV8Fjxu9G1of00MFHt+WYzGMZy7Q==</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>
私钥(C#使用):
<RSAKeyValue><Modulus>0aeb0hFOWt+2hyKvaYP1Dr0F1Q7g/aWC5P8ebDRUMdHZPhD636u4AVOkQHY42jUt7xPbGuWRlQFAv6USrHtEw3nkFcRWz+4NCfaINonZtCu6+K/WNCJ/EH/OdyX4XDIDgJ7PNLspVbZDKRXwV4/aN+u/8LOwIyewJDd8uL8T/Zbebm/7ywqZ07V9G/pxXJ2PREy9ruMS6jmFd6j9YcE6Z6YnsBpo8n814nlGLLrk9igC9z1pLxE55cuO5Ma38sptNnx3SGzZvEwmsYq40Ry7OyfD7EUBP18yrmVs5c19BY1/7yZSlD9TorM6aHSV8Fjxu9G1of00MFHt+WYzGMZy7Q==</Modulus><Exponent>AQAB</Exponent><P>/3KZwPKJTD424QinIkumbgTnKy/hFGpUCZ/QsJd5G2vsdUoLf1oX936IWyej2SmcgAP5qEysTMMfuSYUuPcEby7HwqUtALRRjzoGS540JLIQ8Jw8HQC9FACJBqTydYW/Su8YorBcdKsH3/+kGwaoYhpNrsulddLBCIVHzgBtGk8=</P><Q>0huo+OeUfQum3k3EYhfa5sw0ldRj4znN0b8OFdNorMK2T90pBp0ZVmv0cKyqiJLrIw8Iwxly4NIuz5KtvwzdJhxxazTlDJl/+7XzmnDS0gjfeGAfsWekYKHQq08IOCPsqX7HRFUQ8UEXfN3kWyy9aeN3vk8TAI8RlT0Y4KpZnAM=</Q><DP>RXJJfJwzWWf8kXdBwOAiMfzhP+t3XI5/pFIvcSLtCNhxY32q3IeIxn8+4NFJCSv34RGzmN6nZQMTJ8nDjnmRWgy0wCUZs/xRxAd5WKt875D9a/x9l0DxJnPyzLyhMfQXim6wGuKpcApjTLF6UuKfenQ+NEwnAn42fnOFjuqsvp8=</DP><DQ>yj2bsTLgSFkt3y/GB5HkwGHxgAM3vuHGDs4zlaiwShMGf+tm8RnI6NnzKX3ajKm2skFncryNSoCmVGFg4tRUDro0Jjh8/VrHyZdDi/Zrx4aI7IrCFvanT+iSPkNNqxRRWnlQ/6JOM5svK58+jtCK5mDwwvvEU7Zi+18bEi6HINc=</DQ><InverseQ>tMxQlEUbCRiTmgO8DiirTtQc4QyfU6JSPeCBgCvV3O8nN7ub7P0+aJmo83Yn7mS88Kwt713TSMAb7iu9NP7dCeVR7mhbqTEze6E5kSS0tEDGyK0cB9otyTvzDs7wmvjli7vwfIND3Meqhby3XaDHKq/K10g/NlOpblcbIihnxi0=</InverseQ><D>HyfELRxrQ2/ZRQ2veYOliBIo6rdyUd8lq3gKAlRoaprfqKyHS3POPUw7rWSkIDEk6VFPDxksYDM2dwRF2SHcXxwe++kYaX/bqi5boZcspeyVtV0T/N1feokzmlsnJDQ+dv+ilRh3FQinxFRBShHTgNnkxRU+yIqeT1N7kky64MUki6/OC8p1Vvabed86ce5y9SlDcutZ7DmaCmMKdfdQlw5ctzFKYMP8A8seN0Ow4IBnn5fwnMrzb4aUwzfCdHNfmtN99wtBM+2+da5a04K+l7siJWLHLlG4yzt3BXapX+MNgyF+3FNv+uDQXFOoh8CuTCaxJIDfn+8lcXe9bUdCtQ==</D></RSAKeyValue>
这里需要注意下,.net生成的公钥和私钥都是xml格式的,js使用的公钥是需要pem格式的,需要将xml转换为pem PKCS1模式。
公钥(js使用):
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0aeb0hFOWt+2hyKvaYP1
Dr0F1Q7g/aWC5P8ebDRUMdHZPhD636u4AVOkQHY42jUt7xPbGuWRlQFAv6USrHtE
w3nkFcRWz+4NCfaINonZtCu6+K/WNCJ/EH/OdyX4XDIDgJ7PNLspVbZDKRXwV4/a
N+u/8LOwIyewJDd8uL8T/Zbebm/7ywqZ07V9G/pxXJ2PREy9ruMS6jmFd6j9YcE6
Z6YnsBpo8n814nlGLLrk9igC9z1pLxE55cuO5Ma38sptNnx3SGzZvEwmsYq40Ry7
OyfD7EUBP18yrmVs5c19BY1/7yZSlD9TorM6aHSV8Fjxu9G1of00MFHt+WYzGMZy
7QIDAQAB
-----END PUBLIC KEY-----
2.前端js加密。
前端加密将使用到JSEncrypt库,详见,或者 这里.
调用方式:
<html>
<head>RSA加密测试</head>
<script type="text/javascript" src="jquery-3.4.1.min.js"></script>
<script type="text/javascript" src="RSA.js"></script>
<style type="text/css">
textarea {
width: 800px;
height: 120px;
outline: none;
border: 1px solid #ccc;
border-radius: 5px
}
</style>
<body>
<div>
<div>
公钥:<textarea type="text" id="publicKey"></textarea><br />
明文:<textarea type="text" id="input"></textarea><br />
<input type="button" value="加密" id="btnEncode" />
</div>
<div class="output">
密文:<textarea type="text" id="output"></textarea>
</div>
<script type="text/javascript">
$(function () {
$("#btnEncode").click(function () {
var publickey = $("#publicKey").val();
var input = $("#input").val();
publickey = publickey.replace("-----BEGIN PUBLIC KEY-----", "");
publickey = publickey.replace("-----END PUBLIC KEY-----", "");
publickey = publickey.replace(/\n/g, "");
publickey = publickey.trim();
var encrypt = new JSEncrypt();
encrypt.setPublicKey(publickey);
var result = encrypt.encrypt(input);
$("#output").val(result);
});
})
</script>
</div>
</body>
</html>