Java PKCS8EncodedKeySpec 签名怎么转化为C#代码?

叫我三三 2019-09-04 11:27:40
测试了很久都没有签名成功。

String keystr="私钥";
byte[] keybyte= HexBin.decode(keystr);

PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(keybyte);
KeyFactory keyFactory = KeyFactory.getInstance("EC") ;
PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec) ;
Signature signature = Signature.getInstance("SHA1withECDSA");
signature.initSign(privateKey);
signature.update(src.getBytes(“UTF-8”));
byte[] arr = signature.sign();
sign = HexBin.encode(arr);

上面的java代码需要转化成C#代码,测试了很久都没成功。
请帮帮忙吧,谢谢。
...全文
1337 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
fw 4.7.2还是4.8正式支持这些其他方式加密,看看msdn也可以搞定,不过一般强制4.7+版本的单位不多,楼上第三方组件的方法更灵活,版本限制比较小。
叫我三三 2019-09-05
  • 打赏
  • 举报
回复
估计问题出在byte上,java中的byte是带符号的。C# 中的byte不带符号,对换需要用 sbyte.

for (int i = 0; i < BASELENGTH; i++)
{
    hexNumberTable[i] = -1;
}
而java中byte默认值是-1; C#中在签名接收的值是byte[] 而不是sbyte[]. 导致一直报超过byte最小值的错误。
叫我三三 2019-09-05
  • 打赏
  • 举报
回复
经过测试还是不行,然后直接调用jar包才成功签名。估计问题出在byte上,java中的byte是带符号的。C# 中的byte不带符号
  • 打赏
  • 举报
回复
ecdsa的可以参考下,看起来跟这篇里的有差别
wanghui0380 2019-09-04
  • 打赏
  • 举报
回复
资料找错了“SHA1withECDSA”才是签名算法 PKCS8EncodedKeySpec是密钥生成 所以你分成两步走。先不管算法部分,先生成密钥,然后在去找算法 PKCS8EncodedKeySpec 从名字上看是RSA 的PKCS#8格式密钥 所以先google “C# RSA PKCS#8”(这种就用谷歌把,百度比较难) 下面是结果 https://www.google.com/search?ei=AzJvXfnnOsni-Ab5paP4Dw&q=C%23+RSA+PKCS%238&oq=C%23+RSA+PKCS%238&gs_l=psy-ab.3...478158.478158..479125...0.0..0.0.0.......0....2j1..gws-wiz.4qhof1mIYmg&ved=0ahUKEwi59bOnn7bkAhVJMd4KHfnSCP8Q4dUDCAs&uact=5 接着找“SHA1withECDSA”算法,这个其实也是RSA算法的一类 so:找到下面的东西 https://blog.csdn.net/kevin860/article/details/82323116 ps:不想继续找了,你知道关键信息了,我想你自己都能找到资料
叫我三三 2019-09-04
  • 打赏
  • 举报
回复
谢谢,我正在看
叫我三三 2019-09-04
  • 打赏
  • 举报
回复
谢谢,我真正看
wanghui0380 2019-09-04
  • 打赏
  • 举报
回复
顺带提一句,基本上收到的资料里都有一个相同的地方 BouncyCastle 所以去nuget上查了一下 https://www.nuget.org/packages/BouncyCastle/ 找到官方说明看一了一下
引用
Signature algorithms supported by SignerUtilities: MD2withRSA, MD4withRSA, MD5withRSA, RIPEMD128withRSA, RIPEMD160withECDSA, RIPEMD160withRSA, RIPEMD256withRSA, SHA-1withRSA, SHA-224withRSA, SHA-256withRSAandMGF1, SHA-384withRSAandMGF1, SHA-512withRSAandMGF1, SHA-1withDSA, and SHA-1withECDSA.
SHA-1withECDSA 结合上面的帖子,差不多可以确定用这个玩意,是可以搞定的

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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