Java和.net加密解密互通RSA

Java代碼:

/*
	 * 公鑰加密,私鑰解密
	 * */
	@SuppressWarnings("deprecation")
	private static void EncRSA() throws UnsupportedEncodingException
	{
		
		//公鑰
		String publickey="<RSAKeyValue><Modulus>lAZkkM9+ety4jYO7EK+UCDw7b2jCukkTSsoSGzjmVeL/x5xwmLezQKmQKd8231SVQ8Kiy576NA28d3/km8P8s9NNYGlTm0/TxjBcF4DhwlLp1cjqJHDEkJF9KLsDHkddCXAdC9CIvQhn5aMtZ0AlDTVB2vcZdga4DYaNyzwmZ9k=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";
		PublicKey pubKey = RsaHelper.decodePublicKeyFromXml(publickey);
		//私鑰
		String privatekey = "<RSAKeyValue><Modulus>lAZkkM9+ety4jYO7EK+UCDw7b2jCukkTSsoSGzjmVeL/x5xwmLezQKmQKd8231SVQ8Kiy576NA28d3/km8P8s9NNYGlTm0/TxjBcF4DhwlLp1cjqJHDEkJF9KLsDHkddCXAdC9CIvQhn5aMtZ0AlDTVB2vcZdga4DYaNyzwmZ9k=</Modulus><Exponent>AQAB</Exponent><P>zJn0qTCSaaPdMm00HwCvmuRTP7i+Hahxbuq9fQVEQq+FI4/Brv6Ir3bPIBklr6q5G4GLUjGNr9l2t7DuwP7AKQ==</P><Q>uTX42WUoxeOvGVZFKfpgwMRjycaLkY4RpTUk/CMaEhURgDq/AxwEFEGDG3iZcp2x6e24W65mOmuwJ+ejqgMQ==</Q><DP>OmYPMWONxt1gu43z/I1jkiBtqph+m1SC3BfgchjYvPgAVoAn1l0Mgpi00gKbgSKHp1Q4ggNm37SAcDnuS+Pq0Q==</DP><DQ>MjAU6dwGq3EiPqxo+5IUa8gL/l5l7aBg2bLH/ecJJoM9BdFld1M9K7wA6g3JDwz6bBh1z6o3m3cZNEzDxx1h0Q==</DQ><InverseQ>HlgXgA1f2xyh5Ap8WYZV+DzP5J0wazVYKhgmky0QEYNYvW42sLgq1pwjovhbUVRUYwzceQgyk6b78ptYXh1BZw==</InverseQ><D>EEKPg3S3gQmD4E+rGc8fpLPxF3DbixkB3IJL8N+UNbUEwcmGeNAdCapWorLZVTj2WIYl2dYxx8wGet36n72soW1vrVJ5YwhJN0bMGP0tAzmU1qrSMwt17jdqKpCLVfBxHJMjMhL6qaSx4LBN4e690LcOG/44Kfm0CViIdyEE6IE=</D></RSAKeyValue>";
		//將C#端私鑰轉換成Java端私鑰
		PrivateKey prvKey=RsaHelper.decodePrivateKeyFromXml(privatekey);
	
		 String dataStr = "jiaye";
         byte[] dataByteArray = dataStr.getBytes("utf-8");
         System.out.println("data的Base64表示:"
                 + Base64Helper.encode(dataByteArray));

         System.out.println((new Date()).toLocaleString() + ": 加密中。。。"); // 加密
         byte[] encryptedDataByteArray = RsaHelper.encryptData(
                 dataByteArray, pubKey);
         System.out.println("encryptedData的Base64表示:"
                 + Base64Helper.encode(encryptedDataByteArray));

         //解密C#加密好的密文:
         System.out.println((new Date()).toLocaleString() + ": C#加密好的密文解密中。。。"); // 解密
         String prvstr="BuVtIEeEkFAnqIES9a1hwe2EY9leETykIRUxhdZAqcJxh97MOk4qHuTnYswTrlX4D+25sPaVnEPfCo5T9+OAhQyKUjitEMDXttP6Hb0W8ya69T3WfUes1HCFLjv7FSgPYLVFpJfvR/z3t+z93CF8pgtbnsIY8ZWpxpt//LmiFNs=";
         
         byte[] b= Base64Helper.decode(prvstr);
         byte[] dec = RsaHelper.decryptData(b, prvKey);
//         System.out.println(new String(dec, "utf-8"));
         
         
         System.out.println((new Date()).toLocaleString() + ": java解密中。。。"); // 解密
                                                                         // byte[]
         byte[] decryptedDataByteArray = RsaHelper.decryptData(
                 encryptedDataByteArray, prvKey);
         System.out.println(new String(decryptedDataByteArray, "utf-8"));
         
         System.out.println((new Date()).toLocaleString() + ": java簽名中。。。");// 簽名
         byte[] signDataByteArray = RsaHelper.signData(dataByteArray,
        		 prvKey);
         System.out.println("signData的Base64表示:"
                 + Base64Helper.encode(signDataByteArray)); 
         
         // 驗籤
         //C#生成的簽名驗證:
         String signc="b87FdJsdVTBkNOoP4kl375mzinY9bcwDZAHOvvw/0sHT7pFF/m1nDnB9UL5hHZ4rNIsV75EIHS43RL4+XgKXx6+xQFbIqIwc7CZ0DYMrKJ7oDCUVZH/BogvhYKpaht4u0vge8Twst12xMGQBH/zy5Hvx1AOJ+xNMMBrPnSRKavE=";

         System.out.println((new Date()).toLocaleString() + ": C#生成的簽名驗籤中。。。");
         byte[] signcbyte= Base64Helper.decode(signc);
         boolean flagc = RsaHelper.verifySign(dataByteArray, signcbyte, pubKey);
         System.out.println("驗簽結果:" + flagc);
         
         
         System.out.println((new Date()).toLocaleString() + ": java驗籤中。。。");
         boolean isMatch = RsaHelper.verifySign(dataByteArray,
                 signDataByteArray, pubKey);
         System.out.println("驗簽結果:" + isMatch);
		
	}



.Net代碼:

public static class RSAHelper
    {
        private const int MAXDECRYPTSIZE = 128;
        /// <summary>  
        /// RSA解密  
        /// </summary>  
        /// <param name="encryptData">經過Base64編碼的密文</param>  
        /// <param name="privateKey">私鑰</param>  
        /// <returns>RSA解密後的數據</returns>  
        public static string decrypt(string encryptData, string privateKey)
        {
            string decryptData = "";
            try
            {
                RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
                provider.FromXmlString(privateKey);
                byte[] bEncrypt = Convert.FromBase64String(encryptData);
                int length = bEncrypt.Length;
                int offset = 0;
                string cache;
                int i = 0;
                while (length - offset > 0)
                {
                    if (length - offset > MAXDECRYPTSIZE)
                    {
                        cache = Encoding.UTF8.GetString(provider.Decrypt(getSplit(bEncrypt, offset, MAXDECRYPTSIZE), false));
                    }
                    else
                    {
                        cache = Encoding.UTF8.GetString(provider.Decrypt(getSplit(bEncrypt, offset, length - offset), false));
                    }
                    decryptData += cache;
                    i++;
                    offset = i * MAXDECRYPTSIZE;
                }
            }
            catch (Exception e)
            {
                throw e;
            }
            return decryptData;
        }

        /// <summary>  
        /// 截取字節數組部分字節  
        /// </summary>  
        /// <param name="input"></param>  
        /// <param name="offset">起始偏移位</param>  
        /// <param name="length">截取長度</param>  
        /// <returns></returns>  
        private static byte[] getSplit(byte[] input, int offset, int length)
        {
            byte[] output = new byte[length];
            for (int i = offset; i < offset + length; i++)
            {
                output[i - offset] = input[i];
            }
            return output;
        }


        /// <summary>
        /// 加密
        /// </summary>
        /// <param name="original">原文</param>
        /// <param name="publicKey">公鑰</param>
        /// <returns></returns>
        public static string encrypt(string original, string publicKey)
        {
            string creatingext;
            try
            {
                var enc = new UTF8Encoding();
                byte[] bytes = enc.GetBytes(original);
                var crypt = new RSACryptoServiceProvider();
                crypt.FromXmlString(publicKey);
                bytes = crypt.Encrypt(bytes, false);
                creatingext = Convert.ToBase64String(bytes);
            }
            catch (Exception ex)
            {

                throw ex;
            }
            return creatingext;
        }
    }


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