首页 新闻 会员 周边

c# 如何RSA加密, 和javascript 相互验证

0
悬赏园豆:50 [已解决问题] 解决于 2018-10-31 10:30

现在的前台加密是JS实现的。我现在想用WINFORM实现同样的功能 也就是加密使用C#实现,得到的密文和JS加密的密文一样

// RSA, a suite of routines for performing RSA public-key computations in
// JavaScript.
// Requires BigInt.js and Barrett.js.
// Copyright 1998-2005 David Shapiro.
// You may use, re-use, abuse, copy, and modify this code to your liking, but
// please keep this header.
// Thanks!
// Dave Shapiro
// dave@ohdave.com

 

function encrypWithRSA(password) {
setMaxDigits(131);
var key = new RSAKeyPair(
"10001",
"",
"8040d82703de6cf8c77d03364b813bd6936edfec3fac7de247707d1695b84ad035c9e8c144285856b33f52d2cacaa6fc272e726e4cc7fdb83438f183389a3ef79994cc7196121fef6cbdfb2b13ec7efc843acfb935017c771cee01532c68b3e432c28d4f7aaa812f856212a009d09c45d0448acdc4256d6465dfdef7716cb56d");
var encryptedPassword = encryptedString(key, encodeURIComponent( password ) );
return encryptedPassword;
}

 encryptionExponent的值:010001

modulus 的值8040d82703de6cf8c77d03364b813bd6936edfec3fac7de247707d1695b84ad035c9e8c144285856b33f52d2cacaa6fc272e726e4cc7fdb83438f183389a3ef79994cc7196121fef6cbdfb2b13ec7efc843acfb935017c771cee01532c68b3e432c28d4f7aaa812f856212a009d09c45d0448acdc4256d6465dfdef7716cb56d

那位大侠帮忙实现吧 或者有这个经验的给按说说

RSA
天下WU双的主页 天下WU双 | 初学一级 | 园豆:84
提问于:2018-08-23 11:35

我找过一次C#rsa加密的源码,最后发现donetcore调用的是azure那边实现的,再弄下去就是看算法文档了,好尴尬,没有继续了。

找点什么 5年前
< >
分享
最佳答案
0

主要你的js是用什么加密算法,你要全贴出来,你这里没有关键代码,根本没有办法分析。

我写了一个小的helper,rsa的,nuget上可以直接安装
https://github.com/xyfy/Helper

这个rsa是可以支持支付宝请求的加解密,签名,验证签名的。

收获园豆:50
心雨纷扬 | 菜鸟二级 |园豆:309 | 2018-10-29 17:54

谢谢你了
问题已经解决了
是用C#调用JS解决的

天下WU双 | 园豆:84 (初学一级) | 2018-10-31 10:26
其他回答(3)
0
dudu | 园豆:31007 (高人七级) | 2018-08-23 11:54

谢谢 DUDU

好像不是答案哦

支持(0) 反对(0) 天下WU双 | 园豆:84 (初学一级) | 2018-08-23 12:33

老大,再看看我的问题呗

支持(0) 反对(0) 天下WU双 | 园豆:84 (初学一级) | 2018-08-25 21:27

@天下吴双: 我们在实际项目中就是用 jsencrypt 加密,用这篇博文中的方法解密的

支持(0) 反对(0) dudu | 园豆:31007 (高人七级) | 2018-08-25 21:51

@dudu: 

我是想用C# 加密,得到js一样的加密结果

支持(0) 反对(0) 天下WU双 | 园豆:84 (初学一级) | 2018-08-25 23:01

@天下吴双: 加密算法是什么?秘钥是什么?明文是什么?期望的密文是什么?

支持(0) 反对(0) dudu | 园豆:31007 (高人七级) | 2018-08-26 12:40
0

参照我的,我是用java,逻辑应该是差不多的。

https://www.cnblogs.com/se7end/p/9522311.html

Se7end | 园豆:204 (菜鸟二级) | 2018-08-23 14:08

这是JAVASCRIPT 用

var key = new RSAKeyPair(
"10001",
"",
"8040d82703de6cf8c77d03364b813bd6936edfec3fac7de247707d1695b84ad035c9e8c144285856b33f52d2cacaa6fc272e726e4cc7fdb83438f183389a3ef79994cc7196121fef6cbdfb2b13ec7efc843acfb935017c771cee01532c68b3e432c28d4f7aaa812f856212a009d09c45d0448acdc4256d6465dfdef7716cb56d");

 

但到 的KEY

支持(0) 反对(0) 天下WU双 | 园豆:84 (初学一级) | 2018-08-23 14:37
0

如果你不嫌麻烦,你就看看,

因为当时我想自己加密jwt token,结果是对上了的,但不知是否会和js一致。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        public static void Main(string[] args)
        {
            RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
            using (StreamWriter sw = new StreamWriter("PublicKey.xml"))//产生公匙
            {
                sw.WriteLine(rsa.ToXmlString(false));
            }
            using (StreamWriter sw = new StreamWriter("PrivateKey.xml"))//产生私匙(也包含私匙)
            {
                sw.WriteLine(rsa.ToXmlString(true));
            }

            var re = Encryption("aaa");


            var text = "";
            MD5 md5 = new MD5CryptoServiceProvider();
            byte[] palindata = Encoding.Default.GetBytes(text);//将要加密的字符串转换为字节数组
            byte[] encryptdata = md5.ComputeHash(palindata);//将字符串加密后也转换为字符数组
            var resultMd5 = Convert.ToBase64String(encryptdata);//将加密后的字节数组转换为加密字符串






            var bsStr = UnBase64String("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9");
            Console.WriteLine(bsStr);
            var enStr = ToBase64String(bsStr);
            Console.WriteLine(enStr);

            var result = MyHmac.CreateToken("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ", "123");
            Console.WriteLine(result);


            Console.ReadKey();
        }

        //加密
        private static string Encryption(string express)
        {
            CspParameters param = new CspParameters();
            param.KeyContainerName = "oa_erp_dowork";//密匙容器的名称,保持加密解密一致才能解密成功
            using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(param))
            {
                byte[] plaindata = Encoding.Default.GetBytes(express);//将要加密的字符串转换为字节数组
                byte[] encryptdata = rsa.Encrypt(plaindata, false);//将加密后的字节数据转换为新的加密字节数组
                return Convert.ToBase64String(encryptdata);//将加密后的字节数组转换为字符串
            }
        }

        //解密
        private static string Decrypt(string ciphertext)
        {
            CspParameters param = new CspParameters();
            param.KeyContainerName = "oa_erp_dowork";
            using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(param))
            {
                byte[] encryptdata = Convert.FromBase64String(ciphertext);
                byte[] decryptdata = rsa.Decrypt(encryptdata, false);
                return Encoding.Default.GetString(decryptdata);
            }
        }
        public static string UnBase64String(string value)
        {
            if (value == null || value == "")
            {
                return "";
            }
            byte[] bytes = Convert.FromBase64String(value);
            return Encoding.UTF8.GetString(bytes);
        }

        public static string ToBase64String(string value)
        {
            if (value == null || value == "")
            {
                return "";
            }
            byte[] bytes = Encoding.UTF8.GetBytes(value);
            return Convert.ToBase64String(bytes);
        }
    }


    public class MyHmac
    {
        public static string CreateToken(string message, string secret)
        {
            secret = secret ?? "";
            var encoding = new System.Text.ASCIIEncoding();
            byte[] keyByte = encoding.GetBytes(secret);
            byte[] messageBytes = encoding.GetBytes(message);
            using (var hmacsha256 = new HMACSHA256(keyByte))
            {
                byte[] hashmessage = hmacsha256.ComputeHash(messageBytes);
                return Convert.ToBase64String(hashmessage);
            }
        }
    }

}
放逐人 | 园豆:694 (小虾三级) | 2018-08-23 17:02

8040d82703de6cf8c77d03364b813bd6936edfec3fac7de247707d1695b84ad035c9e8c144285856b33f52d2cacaa6fc272e726e4cc7fdb83438f183389a3ef79994cc7196121fef6cbdfb2b13ec7efc843acfb935017c771cee01532c68b3e432c28d4f7aaa812f856212a009d09c45d0448acdc4256d6465dfdef7716cb56d

 

这个是怎么用的呢?

支持(0) 反对(0) 天下WU双 | 园豆:84 (初学一级) | 2018-08-25 21:31

@天下吴双: modulus 是密钥的5个参数的一个,如果js有用其生成密钥的方法,C#也应该有,

具体怎么用我不清楚。

支持(0) 反对(0) 放逐人 | 园豆:694 (小虾三级) | 2018-08-27 09:19
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册