网Js RSA加密,后端(Asp.Net)解码(非对称加解密)

前言

RSA加解密知识自行百度了解决一下

1、取得公钥与私钥方法

JSEncrypt Download

下载后将其发布成网站进入:http://127.0.0.1:3000/demo/index.html (各自服务器站口不一样自行)

这样就得到一公钥和私钥

另一种生成公钥与私钥的方法如下:引用 https://blog.csdn.net/qq_39081974/article/details/81059022

======================================Begin======================================

1. OpenSSL官网
官方下载地址: https://www.openssl.org/source/

2. Windows安装方法
OpenSSL官网没有提供windows版本的安装包,可以选择其他开源平台提供的工具。例如 http://slproweb.com/products/Win32OpenSSL.html
以该工具为例,安装步骤和使用方法如下:

2.1 选择32位或者64位合适的版本下载,例如Win64OpenSSL_Light-1_0_2h.exe:

2.2 设置环境变量,例如工具安装在C:\OpenSSL-Win64,则将C:\OpenSSL-Win64\bin;复制到Path中

2.3 打开命令行程序cmd(以管理员身份运行),运行以下命令:

这里路径就是保存地址

利用 openssl 生成公钥私钥
生成公钥: openssl genrsa -out rsa_private_key.pem 1024
生成私钥: openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

======================================End=======================================

2、实践(引用:https://www.jb51.net/article/117127.htm

参数传递的+号处理,在传输时会把+变成空格,不处理后端就报错了。

1、前端代码


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

<!DOCTYPE html>

<html>

<head>

  <meta name="viewport" content="width=device-width" />

  <title>Login</title>

  <script src="jquery-1.10.2.min.js"></script>

  <script src="jsencrypt.min.js"></script>

  <script type="text/javascript">

    $(function () {

      var encrypt = new JSEncrypt();

      encrypt.setPublicKey($("#tra").val());

      var data = encrypt.encrypt("123456789");

      alert(data);

      $("#btn").click(function () {

        $.ajax({

          url: ‘@Url.Action("Login")‘,

          data: "pwd=" + encodeURI(data).replace(/\+/g, ‘%2B‘), //+号的处理:因为数据在网络上传输时,非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,而base64编码在传输到后端的时候,+会变成空格,因此先替换掉。后端再替换回来

          type: ‘post‘,

          success: function (msg) {

            alert(msg);

          }

        });

      });

    });

  </script>

</head>

<body>

  <div>

    <input type="button" id="btn" value="点我" />

    <textarea id="tra" rows="15" cols="65">

      MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCa4KHNwDX44gGmmIAtRu4gjVYt

GWZzcm4t+1wjUD4dn7fMLPvuK7ai4UrfDeEJE1RPwudJw+lJ6crql8wSIg7/DbTl

      G3ihsCT6dT9H5B9OoeR7K9VWUesaW/iyVL6HXiYOANabW14pvJATDmdq91Tfgp6P

      SQyvdfiRdV4r07crpQIDAQAB

    </textarea>

    <hr/>

    注意+号的处理

  </div>

</body>

</html>

2、后端代码


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

public class IndexController : Controller

{

    public ActionResult Login()

    {

      return View();

    }

    [HttpPost]

    public ActionResult Login(string pwd)

    {

      //密钥格式要生成pkcs#1格式的  而不是pkcs#8格式的

      string privateKey = @"MIICWwIBAAKBgQCa4KHNwDX44gGmmIAtRu4gjVYtGWZzcm4t+1wjUD4dn7fMLPvuK7ai4UrfDeEJE1RPwudJw+lJ6crql8wSIg7/DbTlG3ihsCT6dT9H5B9OoeR7K9VW

UesaW/iyVL6HXiYOANabW14pvJATDmdq91Tfgp6PSQyvdfiRdV4r07crpQIDAQAB

AoGABb+3gdb+qeG0b1CogVsT/7//UOaTzPk/FGneKQQTf4SsN+H7lVhTYTG9ARFC

JyoWg8IXqmn2ljhywHPTWWD2RCZIn2sYT1sVkGb70EgHGQLBraFHElmw+DsVJ+nD

fBCfMrJ1TYXlwigjRkaueaoGgG8LdR8XD+Xs5LersPLjZgECQQCguSB7C4wF6oSw

EDmwNF8ffT5cQc1U2OIq6NBG8rafrjb7LsjhOd03pmY7i4LbW3Vvq4AhQpJEdF1C

vd+Sk/BBAkEA9rBhqnyumV09zFEomSX3zZu+bdhTzM4bJDfEa95swp1gANCVvF/t

DCnlBf51EhCWdeGSpARPUkQnXrYfFUDiZQJAAZEshuaa6+fYeVr/JP+tucHf3Mhr

dxtSQTbZ6QcuzqnFMXfIT6HfzU4bCxOWKAthPsB+VFSw1mgIDMGLL4OvwQJAJlVy

V9PYLezXVZCnBmVoBINXLCqZmxHMFey0kS6XKAbcjEPdgNBHPcSk2jGYb540Q00y

RFqHGPmORKF4Yw0aIQJAd5JRtD3z2MgP/vPoKHJNHqY8bboVcmwqVAm6xCZoTCZz

jNV1Cnsdf4wBV3LCDzYBy+xR4qYNUy5CFXN+8WzzAA==";

      try

      {

        RSACryptoServiceProvider rsaCryptoServiceProvider = CreateRsaProviderFromPrivateKey(privateKey);

        //把+号,再替换回来

        byte[] res = rsaCryptoServiceProvider.Decrypt(Convert.FromBase64String(pwd.Replace("%2B","+")), false);

        return Content(Encoding.UTF8.GetString(res));

      }

      catch (Exception exception)

      {

      }

      return Content("");

    }

    private RSACryptoServiceProvider CreateRsaProviderFromPrivateKey(string privateKey)

    {

      var privateKeyBits = System.Convert.FromBase64String(privateKey);

      var RSA = new RSACryptoServiceProvider();

      var RSAparams = new RSAParameters();

      using (BinaryReader binr = new BinaryReader(new MemoryStream(privateKeyBits)))

      {

        byte bt = 0;

        ushort twobytes = 0;

        twobytes = binr.ReadUInt16();

        if (twobytes == 0x8130)

          binr.ReadByte();

        else if (twobytes == 0x8230)

          binr.ReadInt16();

        else

          throw new Exception("Unexpected value read binr.ReadUInt16()");

        twobytes = binr.ReadUInt16();

        if (twobytes != 0x0102)

          throw new Exception("Unexpected version");

        bt = binr.ReadByte();

        if (bt != 0x00)

          throw new Exception("Unexpected value read binr.ReadByte()");

        RSAparams.Modulus = binr.ReadBytes(GetIntegerSize(binr));

        RSAparams.Exponent = binr.ReadBytes(GetIntegerSize(binr));

        RSAparams.D = binr.ReadBytes(GetIntegerSize(binr));

        RSAparams.P = binr.ReadBytes(GetIntegerSize(binr));

        RSAparams.Q = binr.ReadBytes(GetIntegerSize(binr));

        RSAparams.DP = binr.ReadBytes(GetIntegerSize(binr));

        RSAparams.DQ = binr.ReadBytes(GetIntegerSize(binr));

        RSAparams.InverseQ = binr.ReadBytes(GetIntegerSize(binr));

      }

      RSA.ImportParameters(RSAparams);

      return RSA;

    }

    private int GetIntegerSize(BinaryReader binr)

    {

      byte bt = 0;

      byte lowbyte = 0x00;

      byte highbyte = 0x00;

      int count = 0;

      bt = binr.ReadByte();

      if (bt != 0x02)

        return 0;

      bt = binr.ReadByte();

      if (bt == 0x81)

        count = binr.ReadByte();

      else

        if (bt == 0x82)

        {

          highbyte = binr.ReadByte();

          lowbyte = binr.ReadByte();

          byte[] modint = { lowbyte, highbyte, 0x00, 0x00 };

          count = BitConverter.ToInt32(modint, 0);

        }

        else

        {

          count = bt;

        }

      while (binr.ReadByte() == 0x00)

      {

        count -= 1;

      }

      binr.BaseStream.Seek(-1, SeekOrigin.Current);

      return count;

    }

}

测试源码在下面GitHub上有(可以给我留言)

https://github.com/xiaoruilin/EncryptionDecrypt

加密参数过长?https://www.jianshu.com/p/444011941cac

原文地址:https://www.cnblogs.com/xiaoruilin/p/11747701.html

时间: 2024-10-13 14:18:18

网Js RSA加密,后端(Asp.Net)解码(非对称加解密)的相关文章

php rsa 非对称加解密类

<?php header("Content-Type: text/html;charset=utf-8"); /* 生成公钥.私钥对,私钥加密的内容能通过公钥解密(反过来亦可以) 下载开源RSA密钥生成工具openssl(通常Linux系统都自带该程序),解压缩至独立的文件夹,进入其中的bin目录,执行以下命令: openssl genrsa -out rsa_private_key.pem 1024 #生成原始 RSA私钥文件 rsa_private_key.pem opens

rsa加密后端解密出现中文乱码解决方法

今天被这个中文乱码的问题困扰了一天,故事是这样的: 前端rsa加密,后端去解密,但是呢有中文的时候解密出来就乱了,想了各种办法未果: 结论,既然中文乱码,我就不传中文就行了哈.在加密之前用 // 前端加密前将所有中文encoder掉 var en = encodeURIComponent(str); // 后台再转换回来就行了 String result = java.net.URLDecoder.decode(en ,"UTF-8"); 这个方法很巧妙的利用了解决url加密的工具,何

RSA 非对称加解密 公私钥的生成

加密和签名使用不同的密钥对,签名密钥对的私钥用于签名,其对应的公钥用于验证签名. 加密密钥对的公钥用于加密,其对应的私钥用于解密. 1.生成密钥对 /** * 生成RSA随机密钥对(公钥和私钥) * @return */ public static Map<String, String> createKeyPair() throws Exception { Map<String,String> keyPairMap = new HashMap<>(); // 密钥生成器

RSA加密异常

在利用RSA进行数据加密时,出现如下异常: Exception in thread "main" javax.crypto.IllegalBlockSizeException: Data must not be longer than 117 bytes at com.sun.crypto.provider.RSACipher.a(DashoA13*..) at com.sun.crypto.provider.RSACipher.engineDoFinal(DashoA13*..) a

java RSA加密生成license,用CPU序列号生成机器码

? license里就是一些注册信息,键值对组成的字符串 ? 对称加密: DES,AES,加密解密都用一个秘钥,速度快 非对称机密 RSA,可以私钥加密公钥解密,也可以公钥机密私钥解密,速度慢 注意:RSA加密明文最大长度117字节,解密要求密文最大长度为128字节,所以在加密和解密的过程中需要分块进行.RSA加密对明文的长度是有限制的,如果加密数据过大会抛出异常: ? 常见加密算法 DES? ??? DES是Data Encryption Standard(数据加密标准)的缩写,DES算法为密

java RSA加密解密

该工具类中用到了BASE64,需要借助第三方类库:javabase64-1.3.1. jar 注意: RSA加密明文最大长度117字节,解密要求密文最大长度为128字节,所以在加密和解密的过程中需要分块进行. RSA加密对明文的长度是有限制的,如果加密数据过大会抛出如下异常: Exception in thread "main" javax.crypto.IllegalBlockSizeException: Data must not be longer than 117 bytes

C++调用openssl库生成RSA加密秘钥对

直接上代码.默认生成的是pkcs#1格式 // ---- rsa非对称加解密 ---- // #define KEY_LENGTH 1024 // 密钥长度 #define PUB_KEY_FILE "pubkey.pem" // 公钥路径 #define PRI_KEY_FILE "prikey.pem" // 私钥路径 // 函数方法生成密钥对 void generateRSAKey(std::string strKey[2]) { // 公私密钥对 size_

java与IOS之间的RSA加解密

很简单的一个需求,ipad端给密码RSA加密,传到java后台,解密.RSA加密算法是基于一个密钥对的,分为公钥和私钥,一般情况公钥加密,私钥解密,但也可私钥加密,公钥解密.还可以验签,就是先用私钥对数据进行加密,然后对加密后的数据进行签名,得到一个签名值.然后再用公钥先验签,证明是对应私钥加密过的数据才解密.主要是为了防止来源不确定的数据.     根据上面的介绍,大家也都知道,RSA算法的关键就是密钥对,我和IOS的同事各自找了RSA的算法实现代码,都能正常根据密钥对加解密.问题是我们各自使

php RSA 加解密实例

1 <?php 2 header("Content-Type: text/html;charset=utf-8"); 3 /* 4 5 生成公钥.私钥对,私钥加密的内容能通过公钥解密(反过来亦可以) 6 7 下载开源RSA密钥生成工具openssl(通常Linux系统都自带该程序),解压缩至独立的文件夹,进入其中的bin目录,执行以下命令: 8 9 openssl genrsa -out rsa_private_key.pem 1024 #生成原始 RSA私钥文件 rsa_pri