測驗了很久都沒有簽名成功。

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#代碼,測驗了很久都沒成功。
請幫幫忙吧,謝謝。
uj5u.com熱心網友回復:
資料找錯了“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:不想繼續找了,你知道關鍵資訊了,我想你自己都能找到資料
uj5u.com熱心網友回復:
ecdsa的可以參考下,看起來跟這篇里的有差別uj5u.com熱心網友回復:
順帶提一句,基本上收到的資料里都有一個相同的地方BouncyCastle
所以去nuget上查了一下
https://www.nuget.org/packages/BouncyCastle/
找到官方說明看一了一下
SHA-1withECDSA
結合上面的帖子,差不多可以確定用這個玩意,是可以搞定的
uj5u.com熱心網友回復:
謝謝,我真正看uj5u.com熱心網友回復:
謝謝,我正在看uj5u.com熱心網友回復:
fw 4.7.2還是4.8正式支持這些其他方式加密,看看msdn也可以搞定,不過一般強制4.7+版本的單位不多,樓上第三方組件的方法更靈活,版本限制比較小。uj5u.com熱心網友回復:
經過測驗還是不行,然后直接呼叫jar包才成功簽名。估計問題出在byte上,java中的byte是帶符號的。C# 中的byte不帶符號uj5u.com熱心網友回復:
估計問題出在byte上,java中的byte是帶符號的。C# 中的byte不帶符號,對換需要用 sbyte.
for (int i = 0; i < BASELENGTH; i++)
{
hexNumberTable[i] = -1;
}
而java中byte默認值是-1;
C#中在簽名接收的值是byte[] 而不是sbyte[].
導致一直報超過byte最小值的錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/121476.html
標籤:C#
下一篇:使用GrantResourceOwnerCredentials時候 如何獲得自定義回傳錯誤 而不是 context.SetError的默認格式
