C# Java RSA互通

 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

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章