node-forge rsa 加解密示例

<!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>
文章目录