- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在测试 BouncyCaSTLe 以使用 ECDSA
、nist P251
验证签名。(Xamarin 的加密 API 还没有实现,我开始使用 Bouncy CaSTLe lib。)
无论如何,我面对下面的代码,是...方法 B 与 C#
API 一起正常工作,方法 A 则不然。A方法的ECPoint看起来有问题,但我无法检查细节。
(我有 checked ,但无法修复。)
我应该如何更改 A 方法?欢迎任何想法。提前致谢。
using Org.BouncyCastle.Asn1;
using Org.BouncyCastle.Asn1.Nist;
using Org.BouncyCastle.Asn1.X9;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Math;
using Org.BouncyCastle.Math.EC;
using Org.BouncyCastle.Security;
using Org.BouncyCastle.Utilities.Encoders;
using System;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
namespace TestMe
{
class Program
{
public static byte[] HexStringToByteArray(string Hex)
{
byte[] Bytes = new byte[Hex.Length / 2];
int[] HexValue = new int[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x0B, 0x0C, 0x0D,
0x0E, 0x0F };
for (int x = 0, i = 0; i < Hex.Length; i += 2, x += 1)
{
Bytes[x] = (byte)(HexValue[Char.ToUpper(Hex[i + 0]) - '0'] << 4 |
HexValue[Char.ToUpper(Hex[i + 1]) - '0']);
}
return Bytes;
}
static void Main(string[] args)
{
String sig
= "e1f5cecccedfe5228d9331098e84b69a0675cdd9ac066ecfada7fea761f52a4cde902a0abd362883127230326fb556af14e894d39a3e14437aaa4134a3476c84";
String msg = "00000000dcb320137ddd6f825660750ab655219fad66951c64f0420be8ac902975197ed2b0da54cd3d502d34dd04c8d74b2958a0b8792ae4730df6d25a6969bcad9f93a7d6229e5a0100000017cf5242732bba21a0b0e7dad7102cf7bdb2c8d7a665045816a886d7";
String pub = "b679e27513e2fff8fdeb54409c242776f3517f370440d26885de574a0b0e5309a9de4ea055b0bf302d9f00875f80e28cd29bb95a48aa53746d7de9465123dbb7";
A(HexStringToByteArray(msg), HexStringToByteArray(sig), HexStringToByteArray(pub));
B(HexStringToByteArray(msg), HexStringToByteArray(sig), HexStringToByteArray(pub));
}
//incorrect
static void A(byte[] message, byte[] signature, byte[] pubkey)
{
BigInteger x = new BigInteger(1, pubkey.Take(32).ToArray());
BigInteger y = new BigInteger(1, pubkey.Skip(32).ToArray());
X9ECParameters ecParams = NistNamedCurves.GetByName("P-256");
ECDomainParameters domainParameters = new ECDomainParameters(ecParams.Curve, ecParams.G, ecParams.N, ecParams.H, ecParams.GetSeed());
var G = ecParams.G;
Org.BouncyCastle.Math.EC.ECCurve curve = ecParams.Curve;
Org.BouncyCastle.Math.EC.ECPoint q = curve.CreatePoint(x, y);
ECPublicKeyParameters pubkeyParam = new ECPublicKeyParameters(q, domainParameters);
var verifier = SignerUtilities.GetSigner("SHA-256withECDSA");
verifier.Init(false, pubkeyParam);
verifier.BlockUpdate(message, 0, message.Length);
bool result = verifier.VerifySignature(signature);
Console.WriteLine("result: " + result);
}
// correct
static void B(byte[] message, byte[] signature, byte[] pubkey)
{
var Q = new System.Security.Cryptography.ECPoint();
var param = new ECParameters();
Q.X = pubkey.Take(32).ToArray();
Q.Y = pubkey.Skip(32).ToArray();
param.Curve = System.Security.Cryptography.ECCurve.NamedCurves.nistP256;
param.Q = Q;
var ecdsa = ECDsa.Create(param);
bool result = ecdsa.VerifyData(message, signature, HashAlgorithmName.SHA256);
Console.WriteLine("result: " + result);
}
}
}
最佳答案
您使用充气城堡验证签名的代码是正确的。问题出在签名格式上。
ECDSA 签名基本上是两个数字,通常称为r
和s
。在您示例的签名中,这两个数字只是连接在一起。它们每个都是 32 字节,所以你的签名是 64 字节。
这种格式(串联的数字)是 .NET api 所期望的,而不是 Bouncy CaSTLe 所期望的。 Bouncy CaSTLe 期望签名采用 DER 编码(就像规范规定的那样)。
因此您需要将签名从当前格式“转换”为 BC 期望的格式,如下所示:
// expected format is SEQUENCE {INTEGER r, INTEGER s}
var derSignature = new DerSequence(
// first 32 bytes is "r" number
new DerInteger(new BigInteger(1, signature.Take(32).ToArray())),
// last 32 bytes is "s" number
new DerInteger(new BigInteger(1, signature.Skip(32).ToArray())))
.GetDerEncoded();
然后验证这个签名(顺便说一下现在是70字节):
bool result = verifier.VerifySignature(derSignature);
它会正常工作。
关于c# - 使用 BouncyCaSTLe 验证 ECDSA 签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49447378/
我需要创建由“根”证书(自签名,ECDSA)签名的“客户端”ECDSA 证书。“根”证书是按照 Translating Elliptic Curve parameters (BC to MS) 中的描
理论上,如果拥有公钥、签名和已签名的数据并且哈希算法已知,则应该可以验证一段数据的签名。 我有二进制格式的所有这些组件。有人知道验证此签名的最简单方法吗?打开SSL? Python?一个例子会很棒。不
我正在使用ECC证书来观察TLS是如何工作的,谁能帮我区分ECDH-ECDSA-AES128-SHA256和 ECDHE-ECDSA-AES128-SHA256 . 使用时ECDHE-ECDSA-AE
我在执行以下操作时遇到问题: 使用 Python 为 ECDSA SECP256k1 曲线创建公私钥对,并将其打印在终端上。 在 Python 脚本和 visual studio(使用 micro-e
我正在尝试生成用于加密芯片的“原始”、未编码的 ECDSA 签名。目标是在主机 pc 上签署某些内容,然后将其发送到芯片进行验证。但是,我遇到了一个小问题。我的理解是 ECDSA 签名应该是 64 个
我需要使用 ECDSA 算法对消息进行签名并在 java 中发送给接收者。然后,接收方应验证发送方的签名。 因此,为此,接收方拥有发送方的公钥,但在通过以下命令将 java.security.Publ
我正在使用创建 key 对 ECDSA::Signer signer; signer.AccessKey().Initialize(randomGeneratorM, ASN1::secp160r1(
我只需要为 ECDSA 获取私钥和公钥对。 Stanford Javascript Crypto Library 以非标准方式 ( https://groups.google.com/forum/
我一直在为以太坊交易管理器编写签名者服务,我需要使用 Google KMS Golang APIs 签署以太坊交易。 .我将在下面尝试总结我面临的问题。 Ethereum 在 R 中需要紧凑的 RLP
我使用以下两行来生成 ECDSA 私钥的十六进制: openssl ecparam -genkey -name secp256k1 -out data.pem openssl ec -in data.
我正在使用 python 和 cryptography.io 来签署和验证消息。我可以通过以下方式获得签名的 DER 编码字节表示: cryptography_priv_key.sign(messag
是否有为 JWK 创建指纹(又名指纹)的标准规范方法? 从我阅读的内容来看,该标准似乎没有定义 kid应该指定,我觉得很奇怪。对我来说,它是最重要的,因为它是一个确定性的值,而不是一个需要查找表的值,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 8 年前。 Improve
我想知道ECDSA签名和公钥的数据格式是什么规范(或标准)定义的? 我正在 java 卡上测试 ECDSA 签名。我发现签名和公钥值中有一个TLV格式。 * Public key (TV format
我正在尝试创建一个数字证书,该证书将使用 EC key 而不是来自 RSA 的 key 进行自签名,并遵循这些 SO link1和 link2 。我将 link1 中给出的 RSA 签名算法替换为 E
我正在尝试创建一个数字证书,该证书将使用 EC key 而不是来自 RSA 的 key 进行自签名,并遵循这些 SO link1和 link2 。我将 link1 中给出的 RSA 签名算法替换为 E
以下网站经常被引用,我认为是准确的: https://gobittest.appspot.com/Address 我正在尝试在 Golang 中重现这些步骤,但第一步失败:-( 有人可以向我提供一个
我试图从私钥生成公共(public) ECDSA key ,但我没有在互联网上找到关于如何执行此操作的太多帮助。几乎一切都是为了从公钥规范生成公钥,但我不知道如何获得它。到目前为止,这是我整理的内容:
是否有任何库支持从 javascript(前端)的私钥派生 ecdsa 公钥? (有了私钥,我们就可以生成对应的公钥) 我研究了localethereum white paper ,我想实现加密层。
来自OpenSSL documentation 使用命名曲线 prime256v1(又名 P-256)创建给定 SHA-256 哈希值的 ECDSA 签名。 第二步:使用 ECDSA_do_sign(
我是一名优秀的程序员,十分优秀!