首页 > 编程语言 >C# Java RSA互通

C# Java RSA互通

时间:2023-02-16 15:44:29浏览次数:29  
标签:Java cipherbytes encoding C# RsaKeyParameters RSA signer return string

 Java代码

 1 public static void main(String[] args) throws Exception {
 2         String sign=sign("test",PRIVATEKEY,"UTF-8");
 3         System.out.println(sign);
 4     }
 5 
 6     /**
 7      * RSA签名
 8      * @param content 待签名数据
 9      * @param privateKey 支付前置私钥
10      * @param input_charset 编码格式
11      * @return 签名值
12      */
13     public static String sign(String content, String privateKey, String input_charset)
14     {
15         try
16         {
17             PKCS8EncodedKeySpec priPKCS8     = new PKCS8EncodedKeySpec( Base64.decode(privateKey) );
18             KeyFactory keyf                 = KeyFactory.getInstance("RSA");
19             PrivateKey priKey                 = keyf.generatePrivate(priPKCS8);
20 
21             java.security.Signature signature = java.security.Signature
22                     .getInstance("SHA1WithRSA");
23 
24             signature.initSign(priKey);
25             signature.update( content.getBytes(input_charset) );
26 
27             byte[] signed = signature.sign();
28 
29             return Base64.encode(signed);
30         }
31         catch (Exception e)
32         {
33             e.printStackTrace();
34         }
35 
36         return null;
37     }
View Code

 

C# 代码

 public partial class RSAHelper
    {
        #region 私钥加密
        /// <summary>
        /// 基于BouncyCastle的RSA私钥加密
        /// </summary>
        /// <param name="privateKeyJava"></param>
        /// <param name="data"></param>
        /// <returns></returns>
        public static string EncryptPrivateKeyJava(string privateKeyJava, string data, string encoding = "UTF-8")
        {
            RsaKeyParameters privateKeyParam = (RsaKeyParameters)PrivateKeyFactory.CreateKey(Convert.FromBase64String(privateKeyJava));
            byte[] cipherbytes = Encoding.GetEncoding(encoding).GetBytes(data);
            RsaEngine rsa = new RsaEngine();
            rsa.Init(true, privateKeyParam);//参数true表示加密/false表示解密。
            cipherbytes = rsa.ProcessBlock(cipherbytes, 0, cipherbytes.Length);
            return Convert.ToBase64String(cipherbytes);
        }
        #endregion

        #region 公钥解密
        /// <summary>
        /// 基于BouncyCastle的RSA公钥解密
        /// </summary>
        /// <param name="publicKeyJava"></param>
        /// <param name="data"></param>
        /// <param name="encoding"></param>
        /// <returns></returns>
        public static string DecryptPublicKeyJava(string publicKeyJava, string data, string encoding = "UTF-8")
        {
            RsaKeyParameters publicKeyParam = (RsaKeyParameters)PublicKeyFactory.CreateKey(Convert.FromBase64String(publicKeyJava));
            byte[] cipherbytes = Convert.FromBase64String(data);
            RsaEngine rsa = new RsaEngine();
            rsa.Init(false, publicKeyParam);//参数true表示加密/false表示解密。
            cipherbytes = rsa.ProcessBlock(cipherbytes, 0, cipherbytes.Length);
            return Encoding.GetEncoding(encoding).GetString(cipherbytes);
        }
        #endregion

        #region 加签
        /// <summary>
        /// 基于BouncyCastle的RSA签名
        /// </summary>
        /// <param name="data"></param>
        /// <param name="privateKeyJava"></param>
        /// <param name="hashAlgorithm">JAVA的和.NET的不一样,如:MD5(.NET)等同于MD5withRSA(JAVA)</param>
        /// <param name="encoding"></param>
        /// <returns></returns>
        public static string RSASignJavaBouncyCastle(string data, string privateKeyJava, string hashAlgorithm = "SHA1WITHRSA", string encoding = "UTF-8")
        {
            RsaKeyParameters privateKeyParam = (RsaKeyParameters)PrivateKeyFactory.CreateKey(Convert.FromBase64String(privateKeyJava));
            ISigner signer = SignerUtilities.GetSigner(hashAlgorithm);
            signer.Init(true, privateKeyParam);//参数为true验签,参数为false加签
            var dataByte = Encoding.GetEncoding(encoding).GetBytes(data);
            signer.BlockUpdate(dataByte, 0, dataByte.Length);
            //return Encoding.GetEncoding(encoding).GetString(signer.GenerateSignature()); //签名结果 非Base64String
            return Convert.ToBase64String(signer.GenerateSignature());
        }
        #endregion

        #region 验签
        /// <summary>
        /// 基于BouncyCastle的RSA签名
        /// </summary>
        /// <param name="data">源数据</param>
        /// <param name="publicKeyJava"></param>
        /// <param name="signature">base64签名</param>
        /// <param name="hashAlgorithm">JAVA的和.NET的不一样,如:MD5(.NET)等同于MD5withRSA(JAVA)</param>
        /// <param name="encoding"></param>
        /// <returns></returns>
        public static bool VerifyJavaBouncyCastle(string data, string publicKeyJava, string signature, string hashAlgorithm = "SHA1WITHRSA", string encoding = "UTF-8")
        {
            RsaKeyParameters publicKeyParam = (RsaKeyParameters)PublicKeyFactory.CreateKey(Convert.FromBase64String(publicKeyJava));
            ISigner signer = SignerUtilities.GetSigner(hashAlgorithm);
            signer.Init(false, publicKeyParam);
            byte[] dataByte = Encoding.GetEncoding(encoding).GetBytes(data);
            signer.BlockUpdate(dataByte, 0, dataByte.Length);
            //byte[] signatureByte = Encoding.GetEncoding(encoding).GetBytes(signature);// 非Base64String
            byte[] signatureByte = Convert.FromBase64String(signature);
            return signer.VerifySignature(signatureByte);
        }
        #endregion

  

标签:Java,cipherbytes,encoding,C#,RsaKeyParameters,RSA,signer,return,string
From: https://www.cnblogs.com/5tomorrow/p/17127008.html

相关文章

  • 如何展示C语言源文件的汇编代码文件及其二进制目标代码?
    假设一个C语言源文件包含如下函数定义:longmult2(long,long);voidmultstore(longx,longy,long*dest){ longt=mult2(x,y); *dest=t;}在命令行上使用"......
  • CAD导入图片后怎么调整图片比例?
    在CAD制图过程中,有时候会需要将某张图片作为参照插入到图纸中,可是当CAD导入图片过大或者过小时,看起来便会非常不方便。那么,你知道CAD导入图片后怎么调整图片比例吗?接下来小......
  • 让function_graph输出返回值
    最近在分析内核问题时用了function_graph,用它来分析为什么应用的某个系统调用会返回错误。在分析的时候,根据function_graph的输出确定代码执行流程,但是有时又需要知道函数......
  • 申报发布的项目是用SpringSecurity-OAuth2模式登录认证的
    SpringSecurity-OAuth2万文详解https://blog.csdn.net/weixin_68320784/article/details/124103484清晰搞懂SpringSecurity的登录认证https://blog.csdn.net/Aqting/ar......
  • QT中调用不同cpp文件的变量或者函数
    有时候会遇到一个问题,在QT中,需要使用另一个文件的函数或者对象,但是没办法直接使用。一般是在其他类中想使用主类中的函数或者变量方法1:在需要使用的文件中声明这个类, ......
  • android studio的activity中R.layout.activity中的R报错显红原因
    原因是:activity和对于的xml并没有相关联解决:法一:手动在AndroidManifest.xml中添加:<activity  android:name="........"  android:exported="fa......
  • CF653B 1300
    题意长度为n的字符串(字符串中只有abcdef共6种字母),有q种压缩方式,可以将字符串的前两个字符压成1个字符,求凭借这q种压缩方式,有几种长度为n的字符串最终能被压缩成字符'a'.......
  • react从零开始创建使用01
    一、react使用场景:可以开发web应用可以开发移动端原生应用(react-native)可以开发VR虚拟现实应用(react360)二、react安装使用:命令安装npminstallreactrea......
  • 《用 libcurl 实现 HTTP 下载文件,其中设置了超时时间,以便在网络异常时能够快速中止下
    CURLOPT_TIMEOUT选项设置了超时时间为10秒,如果在这个时间内没有下载完成,则会返回一个超时错误,可以在回调函数中进行错误处理。如果网络异常或其他错误,也会在curl_eas......
  • Quartz定时任务Cron表达式详解
    Quartz定时任务Cron表达式详解cron表达式用于配置cronTrigger的实例。cron表达式实际上是由七个子表达式组成。这些表达式之间用空格分隔。1.Seconds(秒)2.Minutes(分)3.H......