Java和.net加密解密互通RSA

来源:互联网 发布:c 语言教程 编辑:程序博客网 时间:2024/04/26 07:52

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;        }    }


0 0
原创粉丝点击