java私钥解密代码,.Net如何重写?

yd_910913 2015-01-13 11:26:26
[ code=java]byte[] msg = "中国人民解放军".getBytes("UTF-8");
// 用证书的公钥加密
CertificateFactory cff = CertificateFactory.getInstance("X.509");
FileInputStream fis1 = new FileInputStream(
"E://TestKey2.cer"); // 证书文件
java.security.cert.Certificate cf = cff.generateCertificate(fis1);
PublicKey pk1 = cf.getPublicKey(); // 得到证书文件携带的公钥
Cipher c1 = Cipher.getInstance("RSA/ECB/PKCS1Padding"); // 定义算法:RSA
c1.init(Cipher.ENCRYPT_MODE, pk1);
byte[] msg1 = c1.doFinal(msg); // 加密后的数据

// 用证书的私钥解密 - 该私钥存在生成该证书的密钥库中
FileInputStream fis2 = new FileInputStream(
"E://TestStore");
KeyStore ks = KeyStore.getInstance("JKS"); // 加载证书库
char[] kspwd = "000000".toCharArray(); // 证书库密码
char[] keypwd = "000000".toCharArray(); // 证书密码
ks.load(fis2, kspwd); // 加载证书
PrivateKey pk2 = (PrivateKey) ks.getKey("TestKey2", keypwd); // 获取证书私钥
fis2.close();
Cipher c2 = Cipher.getInstance("RSA/ECB/PKCS1Padding");
c2.init(Cipher.DECRYPT_MODE, pk2);
byte[] msg2 = c2.doFinal(msg1); // 解密后的数据

System.out.println(new String(msg2, "UTF8")); // 将解密数据转为字符串[/code]


这是java的一段私钥解密的代码,
我没有做过私钥这方面的东西,也没接触过。所以不太清楚在Net里面有没有可能将这个方法重写,同时也没有什么思路去写解密的方法。
麻烦有哪位大牛接触这方面的东西指点一下,感激不尽。
...全文
178 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
yd_910913 2015-01-15
  • 打赏
  • 举报
回复
工作需要,上面让处理其他的事情,这个先放置一下,结贴了,分平均发了。。。
yd_910913 2015-01-15
  • 打赏
  • 举报
回复
引用 7 楼 tcmakebest 的回复:
[quote=引用 3 楼 yd_910913 的回复:] [quote=引用 2 楼 tcmakebest 的回复:] RSA这么重要的算法哪个语言都有实现代码的,网上一大堆,关键还是怎么把密钥转成 .NET 格式,如下:
你可能理解错了, 不是要把密匙转成.Net 。只是要用.Net解密而已。 也就是接收到byte的参数然后通过程序解密 只是这个过程,我不太清楚.net是要如何解密。[/quote] 解密之前难道不要把密钥转成 .NET 的吗, 不然怎么用 .NET 解密.[/quote] 你的意思是需要java设置私钥的时候设置为.net之后才可以使用.net解密吗?
tcmakebest 2015-01-13
  • 打赏
  • 举报
回复
RSA这么重要的算法哪个语言都有实现代码的,网上一大堆,关键还是怎么把密钥转成 .NET 格式,如下:

	private static String getRSAPrivateKeyAsNetFormat(byte[] encodedPrivkey) {
		try {
			StringBuffer buff = new StringBuffer(1024);

			PKCS8EncodedKeySpec pvkKeySpec = new PKCS8EncodedKeySpec(
					encodedPrivkey);
			KeyFactory keyFactory = KeyFactory.getInstance("RSA");
			RSAPrivateCrtKey pvkKey = (RSAPrivateCrtKey) keyFactory
					.generatePrivate(pvkKeySpec);

			buff.append("<RSAKeyValue>");
			buff.append("<Modulus>"
					+ Base64.encode(removeMSZero(pvkKey.getModulus()
							.toByteArray())) + "</Modulus>");

			buff.append("<Exponent>"
					+ Base64.encode(removeMSZero(pvkKey.getPublicExponent()
							.toByteArray())) + "</Exponent>");

			buff.append("<P>"
					+ Base64.encode(removeMSZero(pvkKey.getPrimeP()
							.toByteArray())) + "</P>");

			buff.append("<Q>"
					+ Base64.encode(removeMSZero(pvkKey.getPrimeQ()
							.toByteArray())) + "</Q>");

			buff.append("<DP>"
					+ Base64.encode(removeMSZero(pvkKey.getPrimeExponentP()
							.toByteArray())) + "</DP>");

			buff.append("<DQ>"
					+ Base64.encode(removeMSZero(pvkKey.getPrimeExponentQ()
							.toByteArray())) + "</DQ>");

			buff.append("<InverseQ>"
					+ Base64.encode(removeMSZero(pvkKey.getCrtCoefficient()
							.toByteArray())) + "</InverseQ>");

			buff.append("<D>"
					+ Base64.encode(removeMSZero(pvkKey.getPrivateExponent()
							.toByteArray())) + "</D>");
			buff.append("</RSAKeyValue>");

			return buff.toString().replaceAll("[ \t\n\r]", "");
		} catch (Exception e) {
			System.err.println(e);
			return null;
		}
	}

	private static String getRSAPublicKeyAsNetFormat(byte[] encodedPrivkey) {
		try {
			StringBuffer buff = new StringBuffer(2048);

			X509EncodedKeySpec pvkKeySpec = new X509EncodedKeySpec(
					encodedPrivkey);
			KeyFactory keyFactory = KeyFactory.getInstance("RSA");
			// RSAPrivateCrtKey pvkKey = (RSAPrivateCrtKey) keyFactory
			// .generatePrivate(pvkKeySpec);
			RSAPublicKey pvkKey = (RSAPublicKey) keyFactory
					.generatePublic(pvkKeySpec);
			buff.append("<RSAKeyValue>");
			buff.append("<Modulus>"
					+ Base64.encode(removeMSZero(pvkKey.getModulus()
							.toByteArray())) + "</Modulus>");
			buff.append("<Exponent>"
					+ Base64.encode(removeMSZero(pvkKey.getPublicExponent()
							.toByteArray())) + "</Exponent>");
			buff.append("</RSAKeyValue>");
			return buff.toString().replaceAll("[ \t\n\r]", "");
		} catch (Exception e) {
			System.err.println(e);
			return null;
		}
	}
yd_910913 2015-01-13
  • 打赏
  • 举报
回复

                      byte[] msg = "中国人民解放军".getBytes("UTF-8");
			// 用证书的公钥加密
			CertificateFactory cff = CertificateFactory.getInstance("X.509");
			FileInputStream fis1 = new FileInputStream(
					"E://TestKey2.cer"); // 证书文件
			java.security.cert.Certificate cf = cff.generateCertificate(fis1);
			PublicKey pk1 = cf.getPublicKey(); // 得到证书文件携带的公钥
			Cipher c1 = Cipher.getInstance("RSA/ECB/PKCS1Padding"); // 定义算法:RSA
			c1.init(Cipher.ENCRYPT_MODE, pk1);
			byte[] msg1 = c1.doFinal(msg); // 加密后的数据

			// 用证书的私钥解密 - 该私钥存在生成该证书的密钥库中
			FileInputStream fis2 = new FileInputStream(
					"E://TestStore");
			KeyStore ks = KeyStore.getInstance("JKS"); // 加载证书库
			char[] kspwd = "000000".toCharArray(); // 证书库密码
			char[] keypwd = "000000".toCharArray(); // 证书密码
			ks.load(fis2, kspwd); // 加载证书
			PrivateKey pk2 = (PrivateKey) ks.getKey("TestKey2", keypwd); // 获取证书私钥
			fis2.close();
			Cipher c2 = Cipher.getInstance("RSA/ECB/PKCS1Padding");
			c2.init(Cipher.DECRYPT_MODE, pk2);
			byte[] msg2 = c2.doFinal(msg1); // 解密后的数据

			System.out.println(new String(msg2, "UTF8")); // 将解密数据转为字符串
tcmakebest 2015-01-13
  • 打赏
  • 举报
回复
引用 3 楼 yd_910913 的回复:
[quote=引用 2 楼 tcmakebest 的回复:] RSA这么重要的算法哪个语言都有实现代码的,网上一大堆,关键还是怎么把密钥转成 .NET 格式,如下:
你可能理解错了, 不是要把密匙转成.Net 。只是要用.Net解密而已。 也就是接收到byte的参数然后通过程序解密 只是这个过程,我不太清楚.net是要如何解密。[/quote] 解密之前难道不要把密钥转成 .NET 的吗, 不然怎么用 .NET 解密.
yd_910913 2015-01-13
  • 打赏
  • 举报
回复
麻烦给看一下这块java 代码怎么能改成net的。
yd_910913 2015-01-13
  • 打赏
  • 举报
回复
引用 4 楼 xdashewan 的回复:
[quote=引用 3 楼 yd_910913 的回复:] 你可能理解错了, 不是要把密匙转成.Net 。只是要用.Net解密而已。 也就是接收到byte的参数然后通过程序解密 只是这个过程,我不太清楚.net是要如何解密。
只要解密看这个 http://msdn.microsoft.com/zh-cn/library/system.security.cryptography.rsacryptoserviceprovider.aspx[/quote] 嗯 谢谢, 已经找到了, 另外就是问一下 这边有人用java做了一个文件,没有文件类型,让读取里面的私钥。 具体的读取方式在上面已经贴出来了源码。 我这边需要用私钥解密,但是得不到私钥。
xdashewan 2015-01-13
  • 打赏
  • 举报
回复
引用 3 楼 yd_910913 的回复:
你可能理解错了, 不是要把密匙转成.Net 。只是要用.Net解密而已。 也就是接收到byte的参数然后通过程序解密 只是这个过程,我不太清楚.net是要如何解密。
只要解密看这个 http://msdn.microsoft.com/zh-cn/library/system.security.cryptography.rsacryptoserviceprovider.aspx
yd_910913 2015-01-13
  • 打赏
  • 举报
回复
引用 2 楼 tcmakebest 的回复:
RSA这么重要的算法哪个语言都有实现代码的,网上一大堆,关键还是怎么把密钥转成 .NET 格式,如下:

	private static String getRSAPrivateKeyAsNetFormat(byte[] encodedPrivkey) {
		try {
			StringBuffer buff = new StringBuffer(1024);

			PKCS8EncodedKeySpec pvkKeySpec = new PKCS8EncodedKeySpec(
					encodedPrivkey);
			KeyFactory keyFactory = KeyFactory.getInstance("RSA");
			RSAPrivateCrtKey pvkKey = (RSAPrivateCrtKey) keyFactory
					.generatePrivate(pvkKeySpec);

			buff.append("<RSAKeyValue>");
			buff.append("<Modulus>"
					+ Base64.encode(removeMSZero(pvkKey.getModulus()
							.toByteArray())) + "</Modulus>");

			buff.append("<Exponent>"
					+ Base64.encode(removeMSZero(pvkKey.getPublicExponent()
							.toByteArray())) + "</Exponent>");

			buff.append("<P>"
					+ Base64.encode(removeMSZero(pvkKey.getPrimeP()
							.toByteArray())) + "</P>");

			buff.append("<Q>"
					+ Base64.encode(removeMSZero(pvkKey.getPrimeQ()
							.toByteArray())) + "</Q>");

			buff.append("<DP>"
					+ Base64.encode(removeMSZero(pvkKey.getPrimeExponentP()
							.toByteArray())) + "</DP>");

			buff.append("<DQ>"
					+ Base64.encode(removeMSZero(pvkKey.getPrimeExponentQ()
							.toByteArray())) + "</DQ>");

			buff.append("<InverseQ>"
					+ Base64.encode(removeMSZero(pvkKey.getCrtCoefficient()
							.toByteArray())) + "</InverseQ>");

			buff.append("<D>"
					+ Base64.encode(removeMSZero(pvkKey.getPrivateExponent()
							.toByteArray())) + "</D>");
			buff.append("</RSAKeyValue>");

			return buff.toString().replaceAll("[ \t\n\r]", "");
		} catch (Exception e) {
			System.err.println(e);
			return null;
		}
	}

	private static String getRSAPublicKeyAsNetFormat(byte[] encodedPrivkey) {
		try {
			StringBuffer buff = new StringBuffer(2048);

			X509EncodedKeySpec pvkKeySpec = new X509EncodedKeySpec(
					encodedPrivkey);
			KeyFactory keyFactory = KeyFactory.getInstance("RSA");
			// RSAPrivateCrtKey pvkKey = (RSAPrivateCrtKey) keyFactory
			// .generatePrivate(pvkKeySpec);
			RSAPublicKey pvkKey = (RSAPublicKey) keyFactory
					.generatePublic(pvkKeySpec);
			buff.append("<RSAKeyValue>");
			buff.append("<Modulus>"
					+ Base64.encode(removeMSZero(pvkKey.getModulus()
							.toByteArray())) + "</Modulus>");
			buff.append("<Exponent>"
					+ Base64.encode(removeMSZero(pvkKey.getPublicExponent()
							.toByteArray())) + "</Exponent>");
			buff.append("</RSAKeyValue>");
			return buff.toString().replaceAll("[ \t\n\r]", "");
		} catch (Exception e) {
			System.err.println(e);
			return null;
		}
	}
你可能理解错了, 不是要把密匙转成.Net 。只是要用.Net解密而已。 也就是接收到byte的参数然后通过程序解密 只是这个过程,我不太清楚.net是要如何解密。

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧