1首先拿到java方publicKey跟privateKey,然后利用下面方法转换为C#可以识别的key,需要用到BouncyCastle.Crypto.dll。
(1)java私钥转为c#私钥
public static string RSAPrivateKeyJava2DotNet(string privateKey)
{
var privateKeyParam = (RsaPrivateCrtKeyParameters)PrivateKeyFactory.CreateKey(Convert.From 64String(privateKey));
string res =
string.Format(
\"<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent><P>{2}</P><Q>{3}</Q><DP>{4}</DP><DQ>{5}</DQ><InverseQ>{6}</InverseQ><D>{7}</D></RSAKeyValue>\",
Convert.To 64String(privateKeyParam.Modulus.ToByteArrayUnsigned()),
Convert.To 64String(privateKeyParam.PublicExponent.ToByteArrayUnsigned()),
Convert.To 64String(privateKeyParam.P.ToByteArrayUnsigned()),
Convert.To 64String(privateKeyParam.Q.ToByteArrayUnsigned()),
Convert.To 64String(privateKeyParam.DP.ToByteArrayUnsigned()),
Convert.To 64String(privateKeyParam.DQ.ToByteArrayUnsigned()),
Convert.To 64String(privateKeyParam.QInv.ToByteArrayUnsigned()),
Convert.To 64String(privateKeyParam.Exponent.ToByteArrayUnsigned()));
return res;
}
(2)java公钥转为C#公钥
public static string RSAPublicKeyJava2DotNet(string publicKey)
{
RsaKeyParameters publicKeyParam = (RsaKeyParameters)PublicKeyFactory.CreateKey(Convert.From 64String(publicKey));
return string.Format(\"<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent></RSAKeyValue>\",
Convert.To 64String(publicKeyParam.Modulus.ToByteArrayUnsigned()),
Convert.To 64String(publicKeyParam.Exponent.ToByteArrayUnsigned()));
}
2 将需要验签的数据转换为byte[]类型,用到了下面方法
public static byte[] toByteArray(string arg)
{
if (!string.ReferenceEquals(arg, null))
{
char[] NewArray = new char[1000];
char[] array = arg.ToCharArray();
int length = 0;
for (int i = 0; i < array.Length; i++)
{
if (array[i] != \' \')
{
NewArray[length] = array[i];
length++;
}
}
int EvenLength = (length % 2 == 0) ? length : length + 1;
if (EvenLength != 0)
{
int[] data = new int[EvenLength];
data[EvenLength - 1] = 0;
for (int i = 0; i < length; i++)
{
if (NewArray[i] >= \'0\' && NewArray[i] <= \'9\')
{
data[i] = NewArray[i] - \'0\';
}
else if (NewArray[i] >= \'a\' && NewArray[i] <= \'f\')
{
data[i] = NewArray[i] - \'a\' + 10;
}
else if (NewArray[i] >= \'A\' && NewArray[i] <= \'F\')
{
data[i] = NewArray[i] - \'A\' + 10;
}
}
byte[] byteArray = new byte[EvenLength / 2];
for (int i = 0; i < EvenLength / 2; i++)
{
byteArray[i] = (byte)(data[i * 2] * 16 + data[i * 2 + 1]);
}
return byteArray;
}
}
return new byte[] { };
}
取到byte[]数据以后,再转换为 64
Convert.To 64String(byte[])
3利用验签方法进行验签
public static bool VerifyData(string publicKey, string content, string signature, halg = null)
{
byte[] byte_tmp = Encoding.UTF8.GetBytes(content);
byte[] 64_tmp = Convert.From 64String(signature);
bool res = Execute(publicKey,algorithm => algorithm.VerifyData(byte_tmp, GetHalg(halg), 64_tmp));
return res;
}
继续阅读与本文标签相同的文章
上一篇 :
链表分化问题
-
为什么它有典型FaaS能力,却是非典型FaaS架构? | 开发者必读(065期)
2026-05-18栏目: 教程
-
Mybatis执行SQL的4大基础组件详解
2026-05-18栏目: 教程
-
Java描述设计模式(08):桥接模式
2026-05-18栏目: 教程
-
Java描述设计模式(09):装饰模式
2026-05-18栏目: 教程
-
Java描述设计模式(10):组合模式
2026-05-18栏目: 教程
