c# RSA加密解密,与java代码互通问题
RSA加密解密原本是公开算法,但是和一个java的小伙伴对接却出现了点问题,现在记录一下
首先,RSA的公钥私钥,有2种:
1、pem格式。
2、xml格式。
文章底部有pem格式和对应的xml样本数据(样本数据太长,放在尾部)
对比样本数据知道,如果对方发过来的公钥私钥是带有类似 -----BEGIN PRIVATE KEY----- 这种字符串的,那肯定是pem格式的,如果用c#来使用的话,我们得先转为 xml 格式的,如果为了方便我们直接选一家在线转换的网站即可,比如 https://the-x.cn/certificate/PemToXml.aspx (有密钥泄露风险,可以选择自己写代码来转换,c#有一个库叫 BouncyCastle 可以转换)
这样一来就有对应的xml公钥和私钥了,然后,在用下面的c#代码进行加解密就可以了。
如果和java的小伙伴还有争议的话,可以选一个第三方网站作为参照,C#的小伙伴只要把字符串加密后丢到第三方网站能解密,第三方网站加密后的结果能被c#代码解密,代表c#就没问题了,java的小伙伴也做同样的操作,就可以不用老怀疑对方写的有问题了。。。。。
第三方网站比如:https://www.bejson.com/enc/rsa/
/// <summary>
/// RSA加密
/// </summary>
/// <param name="xmlPublickey"></param>
/// <param name="content"></param>
/// <returns></returns>
public static string RSAEncrypt(string xmlPublickey, string content)
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
byte[] cipherbytes;
rsa.FromXmlString(xmlPublickey); cipherbytes = rsa.Encrypt(Encoding.UTF8.GetBytes(content), false); return Convert.ToBase64String(cipherbytes);
} /// <summary>
/// RSA解密
/// </summary>
/// <param name="xmlPrivatekey"></param>
/// <param name="content"></param>
/// <returns></returns>
public static string RSADecrypt(string xmlPrivatekey, string content)
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
byte[] cipherbytes;
rsa.FromXmlString(xmlPrivatekey);
cipherbytes = rsa.Decrypt(Convert.FromBase64String(content), false); return Encoding.UTF8.GetString(cipherbytes);
}
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwF4/zAUR9+5DG3FPysdb
uM3cUARJFQUsNxXmKX9dVwe9rwqnTW2udMcXWmNvmrXIN78Rv38oEwDATww+/0W2
RXjPuUPOwnUieuAEvE6PGYspUtS/1Yhs01M+XmroEDjTmna09aGcDcSGYKgYNTK/
V+Hz3f2DR5/Uhd7tqJXx+0yDm8RJ6uQoDtWSba4XvyZcKN0qeNLCjmj1UHjtcI00
wSZvmtxWvSeBisDFnMPpybua9AwDRA4Ovr0SSatX6hkHwghih43RoHUr0uj2JZYC
qxhmiyQxQj/GPNTgxzhz59Ta+P7+DZ4ehVPgkKc7fAV6OKeGzL9tJKG26eHSLMR4
TwIDAQAB
-----END PUBLIC KEY-----
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDAXj/MBRH37kMb
cU/Kx1u4zdxQBEkVBSw3FeYpf11XB72vCqdNba50xxdaY2+atcg3vxG/fygTAMBP
DD7/RbZFeM+5Q87CdSJ64AS8To8ZiylS1L/ViGzTUz5eaugQONOadrT1oZwNxIZg
qBg1Mr9X4fPd/YNHn9SF3u2olfH7TIObxEnq5CgO1ZJtrhe/Jlwo3Sp40sKOaPVQ
eO1wjTTBJm+a3Fa9J4GKwMWcw+nJu5r0DANEDg6+vRJJq1fqGQfCCGKHjdGgdSvS
6PYllgKrGGaLJDFCP8Y81ODHOHPn1Nr4/v4Nnh6FU+CQpzt8BXo4p4bMv20kobbp
4dIsxHhPAgMBAAECggEAFz3L22xpZVkGBpTEHS3E6SkGCyzZX47GbslYi3712gP3
aOSSngo4X6eGLMeCvmBkFkghbs+AGfunQGWsXs8fXHliL3H/0wKv7cSPDek35NAp
Z/aITtYyv7149ZNZAky7VBgveNXTst4hlh/4/MRq1cVY32M3rzmiRaJPeGTVXZUF
LCXQE6tlgwjomAgCLzt2uOSmZ9sWMtAnFXFDrSnrZRNTbgzZLkIm3yCxzTpaY8GW
jok4pTwp9pCrD2XwQppSpMZtFGMGzIo8a7EL0ZZYftaZTHm1XkSdZ309qDrO4pfq
mvjErWmobVowpnXEqHhQ+l42Bx99o0NNjLIILJB70QKBgQDw0t9YrwczNN7K5zJW
/aZkMj5kBmjgK0uycL/hmWx81AkOwsNV4r62N6Oiq4IzSfvtXcyt/a7zPhx5cQcs
8VyWZr7XModS8HNsEjSXdN0r84h5x5HffGTSEyfIw1aG/3rTrVGnO6zL6GYlMnFZ
fKiMEnQ3Ag3SVh/d9qSNQREGXQKBgQDMfajdAtj5TJj3N1ERi1LmbZ67slEd4VMg
8GUDWw2PakdT/xSRA/HHNaRAbl/LH3dwioz0db5AmGcfuw7fXQJeHcIlI32AMFQ6
SoSqIZ4x6v+X07Rm2oxFDXZaHh7dy76rchtoFEaePF38hu88ITb9tfjX/j7eSk5Z
f/WHsrY2mwKBgQDLbVW9VByA5OhN/X5IfXtQqCCL3d45flkzIorzxuYdi/8auOrI
YgE3a0iO4NHbAWQN3m5Hi0N9tbnX2+Jz1G6hnakXn1cweG0HnVlPlyg9ODrQpARV
BH8l9YhlzpwI7UaUCJQw7/fHR0kBotqc/PBjYjNJRDLoulew5+eYap43AQKBgDzs
+5DNtmOghLqzSn4Vqp9o7bAykqR6a9AWj6IOUN335kSKbVA/gpu9ybBAsl3MhEON
pC15nzOTtLXpf6bhCUGNUDjMeCnnPFEZvqkJ1x48S+aqdsdmOgCg4DA9ZSjj+W0P
VEcQM3IVvlLsyP57Tu0MeJWx9H06WlmkHD1P66YdAoGAeO5dEj0Qw1zQmjm4p8o/
WQRzZzP7E+jCiGB3KecFsnBCLP1Lst1A6rOnF/KZdjSaNyqtCkVitIfUvKMi83Qz
YjUZctyyODRFTid/eNBFAmYdP8et5iCZXrb3LspfQTzQxE/4qwavNE3rdKKljrSU
5nVh7VZtyG1BZl3CsEwlgVQ=
-----END PRIVATE KEY-----
对应公钥xml格式
<RSAKeyValue>
<Exponent>AQAB</Exponent>
<Modulus>wF4/zAUR9+5DG3FPysdbuM3cUARJFQUsNxXmKX9dVwe9rwqnTW2udMcXWmNvmrXIN78Rv38oEwDATww+/0W2RXjPuUPOwnUieuAEvE6PGYspUtS/1Yhs01M+XmroEDjTmna09aGcDcSGYKgYNTK/V+Hz3f2DR5/Uhd7tqJXx+0yDm8RJ6uQoDtWSba4XvyZcKN0qeNLCjmj1UHjtcI00wSZvmtxWvSeBisDFnMPpybua9AwDRA4Ovr0SSatX6hkHwghih43RoHUr0uj2JZYCqxhmiyQxQj/GPNTgxzhz59Ta+P7+DZ4ehVPgkKc7fAV6OKeGzL9tJKG26eHSLMR4Tw==</Modulus>
</RSAKeyValue>
对应私钥xml格式
<RSAKeyValue>
<D>ZhmWm6OJZeVns6sTkBshpxbOw88ePD9YFWZoTC2pY70Aan8eMdemareYB2b16cf+QvBL/M/Ik6NBxgMust88xYV9pN0Txsno2s8DWB0h6JKDc3mU+zwiFz9GIuEpndbdWcvPcbE6VgkeFgnGYcLpx3Gx1gD5iE07lVolCUrlHp7uV23jm8CSd/aiP29uVD903r+BSJbsynVs6LClZ3TOFYtuFP9Iu905OYL2b8b5C5wjMbdfdPtMf2NGzTEsuwo0GNMZs9XBhDyYz9jvOoiusiou1MVaON9z805fNvLN2xKRAYu+gtmfIhjk8+m56EVyW3n4JQEQYgb5aD83KWZ8IQ==</D>
<DP>HLAEKJf+bWQb+LpityHyXWZMSgGaxxH+fKRPfL1wTgYq7pvGG50sFQLG+RKz7DcsXn0NU8dyZO8K3ZVk0CPy/ZFq9bf4xEt/9XBFqQFAxZCtys9puV9CmE7HitCuW1M8heIFjJZ0L2wBpQDxJqqO2DiUJLDwOY4uNkrfLegVx8E=</DP>
<DQ>K3UgHl2qCLVwBgBsVY2Jj+0SyEmDY8WWpTJ+f2U4/+nSoNEwCXx6ZKAKvtrhV4zvENv6PTddg9+mk7U3DKNiW/oU+1MBO6tJMBWJOx/lnoZ1KUd0v/f5I+/RNLrDfDPOA0QzhNwVZAl9iqSkx76Pg/LJEgjSj2ZDBb3TSRZby6E=</DQ>
<Exponent>AQAB</Exponent>
<InverseQ>M1YfvCVCOuflOFLyfsCn7n1IXS9S1KyiPZjVszBC7g2JeXBCsbK01qH8JfhQ/N9o4LcmJ9hr0893LYirdCy4nLbOUiCrXWnfqSZNQYjND4//0VwwK/aOFPEZygjNlhi8S6ZW8V3+1EA6pCtzBVw241L8jGVx2dV0KQgsnAhJGHg=</InverseQ>
<Modulus>2tInX9DkdeXX3/FThKgE6F7RO24dNk3X589KY1J7usTSQsk2bs6q2pp7X+PZMdpgr1N3P4xQXTFp3xtj1WuzHsBtHtbXZ3sNsZ9bkkRY44xE3bFcCZ6/fYvC53km4OLeLN2YFef5KZg9z1viMVIMOctRoWfqLVkMp5VltCsEfdoXYJymhIbNRIPCHJOe7pRwfJ4fsCbumHAYY0J05K3ozR7eXDcJKP/mSYqHyfwK/DqeoH0YtPR1/aKtuiz0+QJ9Bk5/BRva+lwFk3LTpk/ReJJNklBMm898JQ5tU49wk26j0bLJDo1KyYpnTqoQ70kmBLWZzCExNyETxFTNPEUVIw==</Modulus>
<P>7jpqaofyrjWAezX1aNxd60Lgeu+tPYb+Am0gFS33SgnkY1kIafvWjN+Pwo1U88YmVKToirrIeog7k4k5qNTk7l31EqZK4Bb5acFM+/FEFM6sbGG4Zw4DGZsMYM1OHFZo4CnkMCNRSQ5v4PGJp17EiL1RyOQA3AHPGVYz7QhLQDE=</P>
<Q>6yUbIMGdYxMfWqQQsm2M91j/b9u5Q3yrWHUWXBASXr/M0m0/zYm4VG03xqD59tUw/TCYCSopKC7jqgOb8FOCL0UCJLEhyigB7mNIYkOmsBt4Yq0a33c7GDMsZbTCmVkoDel8TW8jgtnRwdJVe4FWScVur43LFHoiEkeL0C7FiZM=</Q>
</RSAKeyValue>
c# RSA加密解密,与java代码互通问题的更多相关文章
- RSA加密&解密【Java&Scala】
一.简介 RSA加密算法是一种非对称加密算法.在公开密钥加密和电子商业中RSA被广泛使用. RSA公开密钥密码体制.所谓公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解 ...
- C# 与JAVA 的RSA 加密解密交互,互通,C#使用BouncyCastle来实现私钥加密,公钥解密的方法
因为C#的RSA加密解密只有公钥加密,私钥解密,没有私钥加密,公钥解密.在网上查了很久也没有很好的实现.BouncyCastle的文档少之又少.很多人可能会说,C#也是可以的,通过Biginteger ...
- C# Java间进行RSA加密解密交互
原文:C# Java间进行RSA加密解密交互 这里,讲一下RSA算法加解密在C#和Java之间交互的问题,这两天纠结了很久,也看了很多其他人写的文章,颇受裨益,但没能解决我的实际问题,终于,还是被我捣 ...
- C# Java间进行RSA加密解密交互(二)
原文:C# Java间进行RSA加密解密交互(二) 接着前面一篇文章C# Java间进行RSA加密解密交互,继续探讨这个问题. 在前面,虽然已经实现了C# Java间进行RSA加密解密交互,但是还是与 ...
- C# Java间进行RSA加密解密交互(三)
原文:C# Java间进行RSA加密解密交互(三) 接着前面一篇C# Java间进行RSA加密解密交互(二)说吧,在上篇中为了实现 /** * RSA加密 * @param text--待加密的明文 ...
- RSA加密解密及数字签名Java实现--转
RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.当时他们三人都在麻省理工学院 ...
- (转)RSA加密解密及数字签名Java实现
转:http://my.oschina.net/jiangli0502/blog/171263?fromerr=hc4izFe2 RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rives ...
- Java Base64加密、解密原理Java代码
Java Base64加密.解密原理Java代码 转自:http://blog.csdn.net/songylwq/article/details/7578905 Base64是什么: Base64是 ...
- Java使用RSA加密解密签名及校验
RSA加密解密类: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 ...
- C#-java RSA加密解密
using Org.BouncyCastle.Math; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Securi ...
随机推荐
- PHP转Go系列 | ThinkPHP与Gin框架之OpenApi授权设计实践
大家好,我是码农先森. 我之前待过一个做 ToB 业务的公司,主要是研发以会员为中心的 SaaS 平台,其中涉及的子系统有会员系统.积分系统.营销系统等.在这个 SaaS 平台中有一个重要的角色「租户 ...
- 阅读翻译Prompting Engineering Guides之Introduction(提示工程简介)
阅读翻译Prompting Engineering Guides之Introduction(提示工程简介) 关于 首次发表日期:2024-07-19 Prompting Engineering Gui ...
- JAVA私有构造函数---java笔记
在Java中,构造函数是一种特殊的方法,它用于初始化新创建的对象.当我们创建一个类的实例时,构造函数会自动被调用. 构造函数可以有不同的访问修饰符,如public.protected.default( ...
- JavaScript小面试~宏任务和微任务
首先,我们要知道JavaScript是单线程调用,在程序启动的时候,会把不同的代码段分派到不同的调用栈,同步任务在同步栈中直接执行,宏任务分派到宏任务栈,微任务会分配到微任务栈,分配好之后,调用栈会被 ...
- vue小知识~注入provide!
注入表示的是将该组件的相关值,方法,实例向后代组件注入. 祖先元素中定义注入: export default { provide() { return { provideName: provideVa ...
- Python 按分类样本数占比生成并随机获取样本数据
按分类样本数占比生成并随机获取样本数据 By:授客 QQ:1033553122 开发环境 win 10 python 3.6.5 需求 已知样本分类,每种分类的样本占比数,及样本总数,需要随机获取这些 ...
- CRC 循环冗余效验
CRC循环冗余效验 利用多项式 x6 + x4 + x3,实际为使用模2除法来做的加密 常用crc多项式有 名称 生成多项式 数值式 简记式 标准引用 CRC-4 x4+x+1 0x1'3 0x3 I ...
- 用.Net实现GraphRag:从零开始构建智能知识图谱
近来,大模型技术日新月异,使得与其相关的研发项目也层出不穷.其中一个备受关注的技术便是RAG(Retrieval Augmented Generation).今天,我要跟大家分享一个出色的项目:Gra ...
- 解决SpringMVC/SpringBoot @RequestBody无法注入基本数据类型
我们都知道SpringMVC使用 @RequestBody 注解可以接收请求content-type 为 application/json 格式的消息体.但是我们必须使用实体对象,Map或者直接用St ...
- 对于围棋AI作弊的一些思考
最近看到些关于围棋AI作弊的报道有了一些思考. 相关视频链接: https://www.bilibili.com/video/BV1np411f73b/?spm_id_from=autoNext ht ...