java 如何实现PEM格式的RSA加密和解密

思路是:
1、先用.NET生成XML格式的公钥和密钥

         /// <summary>
        ///在给定路径中生成XML格式的私钥和公钥。
        /// </summary>
        public void GenerateKeys(string path)
        {
            using (var rsa = new RSACryptoServiceProvider(RsaKeySize))
            {
                try
                {
                    // 获取私钥和公钥。
                    var publicKey = rsa.ToXmlString(false);
                    var privateKey = rsa.ToXmlString(true);

                    // 保存到磁盘
                    File.WriteAllText(Path.Combine(path, publicKeyFileName), publicKey);
                    File.WriteAllText(Path.Combine(path, privateKeyFileName), privateKey);

                    MessageBox.Show(string.Format("生成的RSA密钥的路径: {0}\\ [{1}, {2}]", path, publicKeyFileName, privateKeyFileName));
                }
                finally
                {
                    rsa.PersistKeyInCsp = false;
                }
            }
        }

2、再用BouncyCastle将XML的公钥和密钥转成PEM格式的

        /// <summary>
        /// RSA私钥格式转换,.net->java
        /// </summary>
        /// <param name="privateKey">.net生成的私钥</param>
        /// <returns></returns>
        public static string RSAPrivateKeyDotNet2Java(string privateKey)
        {
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(privateKey);
            BigInteger m = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Modulus")[0].InnerText));
            BigInteger exp = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Exponent")[0].InnerText));
            BigInteger d = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("D")[0].InnerText));
            BigInteger p = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("P")[0].InnerText));
            BigInteger q = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Q")[0].InnerText));
            BigInteger dp = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("DP")[0].InnerText));
            BigInteger dq = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("DQ")[0].InnerText));
            BigInteger qinv = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("InverseQ")[0].InnerText));

            RsaPrivateCrtKeyParameters privateKeyParam = new RsaPrivateCrtKeyParameters(m, exp, d, p, q, dp, dq, qinv);

            PrivateKeyInfo privateKeyInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(privateKeyParam);
            byte[] serializedPrivateBytes = privateKeyInfo.ToAsn1Object().GetEncoded();
            return Convert.ToBase64String(serializedPrivateBytes);
        }

        /// <summary>
        /// RSA公钥格式转换,.net->java
        /// </summary>
        /// <param name="publicKey">.net生成的公钥</param>
        /// <returns></returns>
        public static string RSAPublicKeyDotNet2Java(string publicKey)
        {
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(publicKey);
            BigInteger m = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Modulus")[0].InnerText));
            BigInteger p = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Exponent")[0].InnerText));
            RsaKeyParameters pub = new RsaKeyParameters(false, m, p);

            SubjectPublicKeyInfo publicKeyInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(pub);
            byte[] serializedPublicBytes = publicKeyInfo.ToAsn1Object().GetDerEncoded();
            return Convert.ToBase64String(serializedPublicBytes);
        } 

3、然后java怎么利用我转换成PEM格式的公钥密钥进行加密和解密,使得跟.NET的一样?

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C#使用PEM文件RSA加密和解密
通常C#使用xml格式的密钥文件,不能使用Linux下的公钥和私钥pem文件。而XML格式密钥对文件有移植性问题,在一个电脑上能用的xml密钥对,换一个电脑不一定能使用(需要从pem文件重新转换为xml)。本源码直接使用linux下的PEM文件来做RSA加密和解密,可避免xml格式文件的移植性问题。完整的源码,Vs2008工程,以编译和测试通过。
RSA加密与解密(Java实现)
RSA的应用 RSA是一种非对称加密算法。现在,很多登陆表单的密码的都采用RSA加密,例如京东中的登陆使用公钥对密码进行加密。 Base64编码 apache.commons-codex包提供了许多编码格式转换,例如Base64。 以下为Base64编码表 使用apache.commons-codex进行Base64对字符串进行编码与解码的程序如下: package com.qian.encod...
c# rsa对于pem格式 私钥加密公钥解密问题
c#里面对于私钥加密公钥进行解密没问题,可是java里对私钥加密的字符串,在c#解密前面出现一段乱码\0然后再是正确的解码,我在c#里面对字符串进行私钥加密,加密的字符串在java里用公钥解密报错 javax.crypto.BadPaddingException: Blocktype mismatch: 0,这个什么原因?对于公钥加密私钥解密c# java里面相互倒是没问题
java RSA加密 解密
java RSA加密解密
RSA加密和解密实现
根据RSA一堆原理,写了个实现的代码,亲测可用,哈哈记录一下 #include #include #include using namespace std; int exgcd(int a,int b,int & x,int & y){ if(b == 0){ x = 1; y = 0; return a; } int r = exgcd(b, a%b, x, y);
java RSA 加密 解密
java RSA加密解密 该工具类中用到了BASE64,需要借助第三方类库:javabase64-1.3.1.jar注意:RSA加密明文最大长度117字节,解密要求密文最大长度为128字节,所以在加密和解密的过程中需要分块进行。RSA加密对明文的长度是有限制的,如果加密数据过大会抛出如下异常: Exception in thread &quot;main&quot; javax.crypto.Ille...
RSA加密与RSA解密
采用快速幂算法以及扩展欧几里得算法实现RSA的加密与解密。
Js RSA 加密、解密,Java RSA 加密、解密
总体思路:前端用公钥加密,后端用私钥解密 rsa.html 展示了js进行加密、解密的过程 RSAUtil.java 是一个java类,后端用到的RSA加解密工具类,里面包含了一个main方法,可以允许进行测试 一般范式 1、前端请求后端生成RSA公钥信息; 2、后台端可以利用RSAUtil.java生成的RSA信息,将私钥自己存起来,将公钥返回给前端 3、前端拿到公钥,进...
java实现RSA加密、解密、签名
一、RSA简介 RSA加密是一种非对称加密。可以在不直接传递密钥的情况下,完成解密。这能够确保信息的安全性,避免了直接传递密钥所造成的被破解的风险。是由一对密钥来进行加解密的过程,分别称为公钥和私钥。两者之间有数学相关,该加密算法的原理就是对一极大整数做因数分解的困难性来保证安全性。通常个人保存私钥,公钥是公开的(可能同时多人持有)。 二、加密和签名的区别 加密和签名都是为 ...
C#实现RSA的加密与解密
流程是这样的,我先需要在证书里面读出公钥(已经实现),然后把需要加密的数据和公钥放到RSA里面加密。现在实现了在证书里提取公钥,但是我不知道怎么把这个公钥放到RSA里面去加密。以下是我在MSDN里看的代码,里面没有描述怎么用公钥...
RSA,JS加密java解密
很简单,一看就懂,用不明白可以留言,看到必回!如果加密中文js里加密之前encodeURIComponent编码一下,java用java.net.URLDecoder.decode(outputStr, "UTF-8");解码
RSA加密问题(jsencrypt加密 java解密)
我这篇博文就是记录我这2天来踩过的坑,为相关相同需求的朋友提供点帮助。 参考文章 http://blog.csdn.net/libraryhu/article/details/50821791 https://github.com/dqmmpb/rsa-demo https://github.com/travist/jsencrypt    ->     issue 首先
rsa加密 js加密 java解密
js加密 js 解密 java加密
如何使用 pem 文件 进行加密和解密
A.pem 公钥rnB.pem 私钥rnrnrn如何使用 公钥加密和私钥解密?
rsa加密(js加密java解密)
rsa加密技术是js前端加密,服务端解密,很适合密文加密传输
RSA加密与解密,python实现rsa加密
rsa是目前互联网主流加密方式,方式为私钥加密,公钥解密或公钥加密,私钥解密,由私钥能推倒出公钥,反过来,由公钥不能推倒出私钥,如果没有私钥得话是不能解密的,安全级别极高。 rsa加密相同内容每次的结果都是不一样的。 下面是python实现rsa加密的代码: import base64 import rsa pubkey = rsa.PublicKey.load_pkcs1_openssl_pem...
PEM格式RSA 秘钥转bin格式
公钥 PUBKey.bits = 1024; for(int tmp=0;tmp<128;tmp++) { PUBKey.modulus[tmp]=decode[29+tmp]; } PUBKey.exponent[127]=decode[159]; FILE *tmpFp=fopen("R_pub.key","wb"); fw
RSA加密与解密毕业论文
关于文本加密与解密的毕业论文,RSA加密解密技术论文
Base64/RSA 加密、解密
Base64/RSA 加密、解密工具类,简单耐用,居家旅行必备之物
RSA加密与解密
采用RSA算法进行文件加密与解密,随机产生秘钥
ios RSA 加密 解密
1.参考链接https://www.jianshu.com/p/43f7fc8d8e14
Python实现RSA加密,解密
import math import random #生成素数数组 def prime_array(): arraya = [] for i in range(2,100): #生成前100中的素数,从2开始因为2是最小的素数 x = prime(i,2) #i为素数时返回True,则将x加入arraya数组中;2为测试值 if x: ...
RSA加密和解密
如前面《RSA算法原理》里描述,RSA算法的加解密操作本质上来讲就是大数的模幂运算,RSA算法的安全性很大程度上取决于填充方式,因此在一个安全的RSA加密操作需要选择一个合适的填充模式,最常见的加密填充模式有RSA_PKCS_V15和RSA_PKCS_V21(OAEP),下面还是以mbedtls里的RSA加密源码为例做进一步分析。 一、RSA加密 /* * Add the message ...
Rsa加密与解密
RSA加密与解密的一个DEMO,如何生成密钥,如何进行加密解密
RSA 加密 解密 算法
RSA加密解密算法,相当不错的例子,适合初学者参考
RSA简单加密与解密
package entity; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import ja
Golang Rsa 加密 解密
1)创建私钥: openssl genrsa -out private.pem 1024 //密钥长度,1024觉得不够安全的话可以用2048,但是代价也相应增大 2)创建公钥: openssl rsa -in private.pem -pubout -out public.pem publicKey privateKey // 加密 f
Rsa 加密与解密
1. OpenSSL生成出来的私钥可能是Base64编码的,所有需要了解Base64编码是什么东西。 参考资料:http://www.cnblogs.com/chengxiaohui/articles/3951129.html 2. OpenSSL生成的私钥,从Base64转成Byte[]之后,有一定的格式,通过解析byte[],可以得到的就是Rsa需要的数据。 参考 : http://
RSA密码学加密与解密
什么是RSA RSA算法是现今使用最广泛的公钥密码算法,也是号称地球上最安全的加密算法。在了解RSA算法之前,先熟悉下几个术语 根据密钥的使用方法,可以将密码分为对称密码和公钥密码 对称密码:加密和解密使用同一种密钥的方式 公钥密码:加密和解密使用不同的密码的方式,因此公钥密码通常也称为非对称密码。 RSA加密 RSA解密 生成密钥对 5.实践 来源于...
RSA加密及解密代码分享
package utils; import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.NoSuchAlgorithmException; import java.security.PrivateKey; im...
RSA加密/解密例子
package encryption; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import java.securi
RSA加密和解密问题
开始写博客完成就是记录自己的工作内容,感觉比其他的方式更好一些 今天的问题是,大平台有个接口,是返回一个公钥的,我需要通过返回的公钥字符串在转换成PublicKey然后加密数据在传给大平台,大平台会通过私钥进行解密。解密后会通过我传入的参数返回给小平台相应的数据。 直接进入主题 1、生成公私钥 无论业务怎么耍,一个应用绑定一个密钥对也好,或者每次重新生成也好,这都无关紧要。     pu
iOS RSA加密和解密
一、使用openssl终端指令生成公钥和私钥证书,最后需要得到公钥证书(public_key.der)和私钥证书(private_key.p12) 1,打开终端前,在桌面新建文件夹CertificateFile(用来存放证书) 2,打开终端cd到Certificate File文件目录(在cd后空格直接拖文件到终端)回车 3,依次输入下面的指令: openssl genrsa -o
Golang RSA加密/解密
package main import ( &quot;crypto/x509&quot; &quot;crypto/rsa&quot; &quot;crypto/rand&quot; &quot;fmt&quot; &quot;encoding/pem&quot; &quot;errors&quot; ) var publicKey = []byte(`-----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNAD
RSA 加密与解密(干货)
class RSA{ private $public_key_resource = ''; //公钥资源 private $private_key_resource = ''; //私钥资源 /** * 构造函数 * @param [string] $public_key [公钥数据字符串] * @param [string] $priv...
RSA加密,解密 与数字签名
package com.example.subang.advancesix; import android.content.SharedPreferences; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Base64; import android.
RSA加密和解密问题?????
客户端使用Windows 应用程序,服务端使用WebService.rn1、客户端发送一个加密的字符串数组给服务端,该字符数组包括RSA对象的Public Key和要加密的字符;rn2、服务端先用传过来的Public Key解密,在使用Private key 加密该字符串,然后返回给客户端。rn同样也传递Public Key.rn现在按照下面的代码执行,总是解密不了,报rn"An unhandled exception of type 'System.Web.Services.Protocols.SoapException' occurred in system.web.services.dllrnrnAdditional information: System.Web.Services.Protocols.SoapException: Server was unable to process request. ---> System.Security.Cryptography.CryptographicException: Bad Key.rnrn at System.Security.Cryptography.RSACryptoServiceProvider._DecryptPKWin2KEnh(IntPtr hPubKey, Byte[] rgbKey, Boolean fOAEP)rn at System.Security.Cryptography.RSACryptoServiceProvider.Decrypt(Byte[] rgb, Boolean fOAEP)rn at RegisterServer.CRSA.DecryptData(Object[] oData) in c:\inetpub\wwwroot\registerserver\crsa.cs:line 40rn at RegisterServer.Service1.GetLicense(Object[] s_cpu_number) in c:\inetpub\wwwroot\registerserver\service1.asmx.cs:line 59rn --- End of inner exception stack trace ---rn"错误,请问是什么原因呢????rnrn部分代码如下:rn客户端:rn。。。。。rnobject oServiceData = null;rnrnSender oSender = new Sender();//创建加密的RSA封装对象rn//加密函数:rnprivate void btn_encrypt_Click(object sender, System.EventArgs e)rn rn Localhost.Service1 oService = new Service1();//创建Webservice对象 rn object[] oData = new object[2];rn oData[0] = oSender.PublicKeyXML();//获取包括Public Key的RSA XML字符串rn oData[1] = oSender.EncryptData(this.textbox1.text.trim());//加密字符串rn oServiceData = oService.GetLicense(oData);//传给服务端,服务端处理后也返回一个object数组对象 rnrnprivate void btn_decrypt_Click(object sender, System.EventArgs e)rnrn oSender.DecryptData(oServiceData); rnrn。。。。。rn//发送类rnclass Senderrn rn RSAParameters rsaPubParams;rn RSAParameters rsaPrivateParams;rnrn public Sender()rn rn RSACryptoServiceProvider rsaCSP = new RSACryptoServiceProvider();rn rn //Generate public and private key data.rn rsaPrivateParams = rsaCSP.ExportParameters(true);rn rsaPubParams = rsaCSP.ExportParameters(false);rn rn rn public string PublicKeyXML()rn rn RSACryptoServiceProvider rsaCSP = new RSACryptoServiceProvider();rnrn rsaCSP.ImportParameters(rsaPubParams); rn return rsaCSP.ToXmlString(false); rn rnrn //Encrypts using only the public key data.rn public byte[] EncryptData(string s_data)rn rn RSACryptoServiceProvider rsaCSP = new RSACryptoServiceProvider();rn ASCIIEncoding myAscii = new ASCIIEncoding();rnrn rsaCSP.ImportParameters(rsaPrivateParams);rn rn return rsaCSP.Encrypt(myAscii.GetBytes(s_data), false);rn rnrn //Decrypt using the private key data.rn public void DecryptData(object[] oData)rn rn byte[] fromEncrypt;rn string roundTrip;rn ASCIIEncoding myAscii = new ASCIIEncoding();rn RSACryptoServiceProvider rsaCSP = new RSACryptoServiceProvider();rnrn rsaCSP.FromXmlString((string)oData[0]);//从传来的XML字符串重新创建RSArn fromEncrypt = rsaCSP.Decrypt((byte[])oData[1], false);rn roundTrip = myAscii.GetString(fromEncrypt);rnrn System.Windows.Forms.MessageBox.Show(roundTrip);rn rn rnrn服务端:rn。。。。rn[WebMethod]rnpublic object[] GetLicense(object[] dataObject)rnrn RegisterServer.CRSA o_rsa = new CRSA();rnrn return o_rsa.DecryptData(dataObject);rnrn。。。。。rn//接收类rn class CRSArn rn RSAParameters rsaPubParams;rn RSAParameters rsaPrivateParams;rnrn public CRSA()rn rn RSACryptoServiceProvider rsaCSP = new RSACryptoServiceProvider();rn rn //Generate public and private key data.rn rsaPrivateParams = rsaCSP.ExportParameters(true);rn rsaPubParams = rsaCSP.ExportParameters(false);rn rnrn public string PublicKeyXML()rn rn RSACryptoServiceProvider rsaCSP = new RSACryptoServiceProvider();rnrn rsaCSP.ImportParameters(rsaPubParams); rn return rsaCSP.ToXmlString(false); rn rnrn //Decrypt using the private key data.rn public object[] DecryptData(object[] oData)rn rn byte[] fromEncrypt;rn RSACryptoServiceProvider rsaCSP = new RSACryptoServiceProvider();rnrn rsaCSP.FromXmlString((string)oData[0]);//从传来的XML字符串重新创建RSArn fromEncrypt = rsaCSP.Decrypt((byte[])oData[1], false); rn rn return EncryptData(fromEncrypt); rnrn rnrn //Encrypts using only the public key data.rn public object[] EncryptData(byte[] byte_data)rn rn object[] oData = new object[2];rn RSACryptoServiceProvider rsaCSP = new RSACryptoServiceProvider();rn ASCIIEncoding myAscii = new ASCIIEncoding();rnrn rsaCSP.ImportParameters(rsaPrivateParams);rn oData[0] = rsaCSP.ToXmlString(false); rn oData[1] = rsaCSP.Encrypt(byte_data,false);rn return oData;rn rn rnrnrnrn
rsa数字签名(加密和解密)
rsa数字签名,产生密钥,加密,解密 等等。。。。。。
RSA加密与解密简单实现
非对称密钥加密概述 使用对称密钥加密体制进行保密通信时,任意不同的两个用户之间都应该使用互不相同的密钥。这样,如果一个网络中有n个用户,他们之间彼此都可能进行秘密通信,这时网络中将需要n(n-1)/2个密钥(其中,每个用户都需要保存n-1个密钥),这样巨大的密钥量给密钥分配和管理带来了极大的困难。另外,随着计算机网络,特别是因特网的发展,网络上互不相识的用户可能需要进行保密的会话(例如,如果用户...
rsa加密/解密
https://www.jb51.net/article/148699.htm
相关热词 c# 标准差 计算 c#siki第五季 c#入门推荐书 c# 解码海康数据流 c# xml的遍历循环 c# 取 查看源码没有的 c#解决高并发 委托 c#日期转化为字符串 c# 显示问号 c# 字典对象池