<!doctype html>
<html>
<head>
<title>JavaScript RSA Encryption</title>
<script src="./jquery.min.js"></script>
<script src="./forge.min.js"></script>
<script type="text/javascript">
// Call this code when the page is done loading.
$(function() {
const publicKey = forge.pki.publicKeyFromPem($('#pubkey').val());
const privateKey = forge.pki.privateKeyFromPem($('#privkey').val());
// 加密函数(使用OAEP填充)
function encryptWithOAEP(message) {
// 将消息转换为字节
var messageBytes = forge.util.encodeUtf8(message);
// 使用OAEP填充方案加密数据
var encryptedBytes = publicKey.encrypt(
messageBytes, 'RSA-OAEP', {
md: forge.md.sha256.create() // 指定哈希算法
});
// 返回Base64编码的结果
return forge.util.encode64(encryptedBytes);
}
// 解密函数(使用OAEP填充)
function decryptWithOAEP(encryptedBase64) {
// 将Base64编码的加密数据转换回原始格式
var encryptedBytes = forge.util.decode64(encryptedBase64);
// 使用OAEP填充方案解密数据
var decryptedBytes = privateKey.decrypt(
encryptedBytes, 'RSA-OAEP', {
md: forge.md.sha256.create() // 确保这里使用的哈希算法与加密时一致
});
return forge.util.decodeUtf8(decryptedBytes);
}
// Run a quick encryption/decryption when they click.
$('#testme').click(function() {
// 假设我们已经有了publicKeyPem 和 privateKeyPem
const encryptedMessage = encryptWithOAEP($('#input').val());
console.log('Encrypted Message:', encryptedMessage);
const decryptedMessage = decryptWithOAEP(encryptedMessage);
console.log('Decrypted Message:', decryptedMessage);
// Now a simple check to see if the round-trip worked.
if (decryptedMessage == $('#input').val()) {
alert('It works!!!');
}
else {
alert('Something went wrong....');
}
});
});
</script>
</head>
<body>
<label for="privkey">Private Key</label><br/>
<textarea id="privkey" rows="15" cols="65">-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAmz0HYXP2q50wxS1G3r9TrPU0XgrAoK8WwtOgYyAyFj1R748i
UV3ACJebffAvHY4BBXsdKG4jPGZhPRbhWMAxegj25U9L2JRF6CrrVbXG/VZYJ/t9
CCfpgcxKWFCgX75ozN2ar9ufrFTAImwLKs7t2V/gawZPXgGxmSKYEfOIysEBY02V
oXXOlWP7hpuOIiK01+V71v+V2oj9sxxlmQetJnGGjg+NKA0WbGiRc1Zay7Vm+37O
FGdffYSfwCN9oo0ijL/nLdBFlthJh/klx+HVvNEdOLX98GiX9Z7qfSt89YI2p1z8
eni8oXfgOY5ltlraSXuySq0ONfD/M4ZnOhEvmQIDAQABAoIBABaEwSVUelu6mZsr
TjR8Ry8NArkBkPUTcOx3YQoACZlK8S/G8OYiAKaTwhfVV4BPW7vnzVBSvwRr9X8J
v/aX1UAr52SsHrHJZbqf6d4CWF3iFeJMNimQtewA2RKmih0ECept2u/XnqSTnAC3
m4cXgqPIUfg0b3Q7hVT+vQBy9feIfdFfOi1tcX74jDUyRskoNGbAbZAxCn4pgh1X
ptejTgWhGWifwdITJ1EzywOTbXM0+b4i+JnuWh4+DMpe/aFXlZLhJr19LAqzDM3J
6KwU4Bq86GFOF/zPZ4KIw6e3Wrgfe69AiQaRrsJmcKGcKUQ5ATXgLj8DwSLXfbPj
vJzDFuECgYEA1jkvS0n3rtOJLoXabt3FVpbsuumBWmYDVsmkeixJGVDQXdrbemRf
LJ8aghKX8wg5Rleefannm/fiXPw/OSce6cfbiTwggyPzNqIg86gKakEsmxgIKtGU
Tr3bPskkxO4W2k9AYw34O4RM5KQoNpWS1GnuzalqURSzzaiaPpG4kaMCgYEAuYMZ
Bkjs9GjBlPsM6tNdN++NtqRtyZZO7QddhlYjde/KsM3QMU5H6BrY01zDsQu7Qhdc
uMQ3jufdRzS+7TmVrJpX766C6Mxkw5kLFATDfN8JB3QplstU2hOjC9fHLISGCwSz
CD/oRNPtEsbRiIUua5XWK9CHdMiubAxItRpjJZMCgYAcNY+KxIS/Gs/3tlybOMzh
qCIoQtNryf8qkIb+J5LAqKmnkkhQh6MYxyLAeh5UPIL+Rk9ykMsU+MFwKS9SIVqq
wkygd7B4VGWUjij0rO4iK87p5XI94Tc8XzfdvrL+07NisAj0gkRr4fIWMZ+yAGRD
YGe34VVEtAsxS8Bz+NBrLQKBgHjgilrFA9kRtSltF/Ke/Luo1O8wXvUegpkB1pfk
4sBDGhBwWvr1pfcAH05BwKVJHqAm9tzRxd3RCScPoGSUxAkunKPpUxV7sSCeRVCq
9fIUph58O2ktXkGmz/O0iuxgAbOGQV3bvm2ypWQ5tmg9V4z0mhP8kXawGK8AphOT
eQ0PAoGBAKKyLdtYnXaG6TmJatTkrGWK0eTq/or1fEah7eqneCbj5uldXhsZl7nh
bFWPYfQ9o1pocNC1iMmnpf30ZZMG0Ia6P2dRT9XJ8282f1NG3hQNeEpZ+qQbNbjk
ujE8dk9Qf5x919e+a8/8WqM6N6DEJNze5ZAT081l69x15EmIpjnu
-----END RSA PRIVATE KEY-----</textarea><br/>
<label for="pubkey">Public Key</label><br/>
<textarea id="pubkey" rows="15" cols="65">-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmz0HYXP2q50wxS1G3r9T
rPU0XgrAoK8WwtOgYyAyFj1R748iUV3ACJebffAvHY4BBXsdKG4jPGZhPRbhWMAx
egj25U9L2JRF6CrrVbXG/VZYJ/t9CCfpgcxKWFCgX75ozN2ar9ufrFTAImwLKs7t
2V/gawZPXgGxmSKYEfOIysEBY02VoXXOlWP7hpuOIiK01+V71v+V2oj9sxxlmQet
JnGGjg+NKA0WbGiRc1Zay7Vm+37OFGdffYSfwCN9oo0ijL/nLdBFlthJh/klx+HV
vNEdOLX98GiX9Z7qfSt89YI2p1z8eni8oXfgOY5ltlraSXuySq0ONfD/M4ZnOhEv
mQIDAQAB
-----END PUBLIC KEY-----</textarea><br/>
<label for="input">Text to encrypt:</label><br/>
<textarea id="input" name="input" type="text" rows=4 cols=70>admin</textarea><br/>
<input id="testme" type="button" value="test" /><br/>
</body>
</html>