我正在尝试使用C#和.NetCF验证X.509证书.我有CA证书,如果我理解正确,我需要使用此CA证书中的公钥来解密不受信任证书的签名.这应该给我不受信任证书的计算哈希值.然后我应该自己计算证书的哈希值,并确保两个值匹配.
我已经玩了几天了,我没有走得太远.我一直在使用X509Certificate和RSACryptoServiceProvider类.首先,我尝试从X509Certificate类中获取公钥和签名.我能够获得公钥而不是签名.接下来,我尝试解析构成证书的二进制数据,这允许我获取签名(以及我想要的任何其他数据),但我无法使用RSACryptoServiceProvider解密签名.我试过这样的事情,但在我试图解密的时候不断得到说"Bad Key"的异常:
RSAParameters rsaParams = new RSAParameters();
rsaParams.Exponent = exp;
rsaParams.Modulus = mod;
RSACryptoServiceProvider rsaServ = new RSACryptoServiceProvider();
rsaServ.ImportParameters(rsaParams);
byte[] decryptedSig = rsaServ.Decrypt(encryptedSig, false);
Run Code Online (Sandbox Code Playgroud)
任何建议将不胜感激.
编辑:我尝试了似乎更好的东西,但返回了一个奇怪的结果.我在这里使用X509Certificate2类,因为它更容易进行测试,但我需要稍后切换到.NetCF的X509Certificate.我认为RSACryptoServiceProvider.VerifyData可能就是我所需要的.我尝试了以下代码.
X509Certificate2 cert = new X509Certificate2(certBytes);
X509Certificate2 certCA1 = new X509Certificate2(@"C:\certs\certCA1.cer");
byte[] encryptedSig = new byte[256];
Array.Copy(certBytes, certBytes.Length - 256, encryptedSig, 0, 256);
RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)certA1.PublicKey.Key;
bool good = rsa.VerifyData(cert.RawData, "1.3.14.3.2.26", encryptedSig);
Run Code Online (Sandbox Code Playgroud)
正如我所说,我能够手动解码和解释证书的二进制数据,所以我很确定cert.RawData是证书的签名数据,最后256个字节是加密签名.字符串是我从证书中获得的哈希算法的OID,但我不是100%确定它是正确的.VerifyData返回false,但我不确定为什么.
思考?
我有一个客户端应用程序,它序列化一个对象并将其发送到服务器应用程序.服务器应反序列化对象,对其进行更改,然后对其进行序列化并将其发回.
服务器代码:
TcpClient client = server.AcceptTcpClient();
using(NetworkStream stream = client.GetStream())
{
using(StreamReader streamReader = new StreamReader(stream))
{
string xmlData = streamReader.ReadToEnd();
}
}
Run Code Online (Sandbox Code Playgroud)
除非客户端关闭流,否则ReadToEnd不会返回.但是如果客户端关闭了流,我就无法发送响应.
有一个更好的方法吗?
我有一个X.509证书,其中包含一组带有以下IMPLICIT [0]标记的数据:
A0 81 C6 (value)...
Run Code Online (Sandbox Code Playgroud)
我从标准文件中摘录了这些内容:
IMPLICIT [0]标记不用于DER编码,而是使用EXPLICIT SET OF标记.也就是说,必须包含EXPLICIT SET OF标记的DER编码,而不是IMPLICIT [0]标记的DER编码以及值的长度和内容八位字节.
我已经做了很多搜索,但我无法弄清楚标准要求的确切内容.我正在寻找一些澄清.
编辑:这是我遵循的标准:http://tools.ietf.org/html/rfc3852
我正在尝试验证X.509签名,我需要计算消息摘要来执行此操作.此证书包含SignerInfo类型中的可选SignedAttributes.我已经对签名内容进行了哈希处理,并验证了SignedAttributes中的消息摘要是否正确.该标准规定,如果存在SignedAttributes,则应对其进行散列和加密以创建证书的签名.该标准还说,应该按照原始问题中的讨论更改SignedAttributes的标记.
这是SignerInfo的Asn.1语法:
SignerInfo ::= SEQUENCE {
version CMSVersion,
sid SignerIdentifier,
digestAlgorithm DigestAlgorithmIdentifier,
signedAttrs [0] IMPLICIT SignedAttributes OPTIONAL,
signatureAlgorithm SignatureAlgorithmIdentifier,
signature SignatureValue,
unsignedAttrs [1] IMPLICIT UnsignedAttributes OPTIONAL }
SignerIdentifier ::= CHOICE {
issuerAndSerialNumber IssuerAndSerialNumber,
subjectKeyIdentifier [0] SubjectKeyIdentifier }
SignedAttributes ::= SET SIZE (1..MAX) OF Attribute
UnsignedAttributes ::= SET SIZE (1..MAX) OF Attribute
Attribute ::= SEQUENCE {
attrType OBJECT IDENTIFIER,
attrValues SET OF …Run Code Online (Sandbox Code Playgroud) 我是python的新手,但我在C++,Java和.NET方面有很多经验.我希望有人可以解释为什么这个示例程序的工作方式以及如何将其更改为按照我希望的方式工作.
本质上,我正在尝试创建一个对象列表,列表中的每个对象都包含一个对象列表.最后,子列表都是相同的列表,而不是其父类实例的唯一列表.
class Obj1(object):
list_of_obj2 = []
name = ''
class Obj2(object):
name = ''
list_of_obj1 = []
for i in range(2):
new_obj1 = Obj1()
new_obj1.name = "obj1_%s" % i
print "Creating Object1 named %s" % new_obj1.name
for j in range(2):
new_obj2 = Obj2()
new_obj2.name = "...obj2_%s_%s" % (i, j)
new_obj1.list_of_obj2.append(new_obj2)
print "...Added Object2 named %s to %s list" % (new_obj2.name, new_obj1.name)
list_of_obj1.append(new_obj1)
print "Added Object1 named %s to master list" % (new_obj1.name)
print ""
for obj in list_of_obj1:
print …Run Code Online (Sandbox Code Playgroud)