我正在使用python-crypto API在Python2中编写一个客户端来对XML文件进行数字签名,我有一个用Scala编写的服务,用于验证签名.我的Python代码看起来像这样:
from Crypto.PublicKey import RSA
from Crypto.Hash import SHA
from os import urandom
import logging
...
...
Run Code Online (Sandbox Code Playgroud)
要生成密钥(keysize为2048):
self.__key = RSA.generate(self.keySize,urandom)
self.__private_key = self.__key.exportKey()
self.__public_key = self.__key.publickey().exportKey()
with open(pubPath,'w') as fpub:
logging.info("Writing Public Key to %s" % pubPath)
fpub.write(self.__public_key)
with open(priPath,'w') as fpri:
logging.info("Writing Private Key to %s" % priPath)
fpri.write(self.__private_key)
Run Code Online (Sandbox Code Playgroud)
并且用于阅读键:
self.__private_key = fpri.read()
self.__public_key = fpub.read()
self.__key = RSA.importKey(self.__private_key)
Run Code Online (Sandbox Code Playgroud)
并进行数字签名
logging.debug('Data to sign: "%s"' % data)
digest = SHA.new(data.strip()).digest()
return str(self.__key.sign(digest, None)[0])
Run Code Online (Sandbox Code Playgroud)
然后在Scala/Java中,我使用以下内容:
package com.example.security
import com.example.action.ActionRequest …Run Code Online (Sandbox Code Playgroud) 我有一个X509CertificateObject,一个匹配的RSAPublicKey,并设法创建一个包含某个消息对象的有效数字证书的字节数组,也作为一个字节数组.
不幸的是,我构建的系统只接受CMSSignedData对象作为输入.如何将基本构建块转换为这样的有效CMSSignedData对象?
背景:我正在尝试根据这个例子的 Java Bouncy Castle RSA盲签名(摘要是SHA512)并且需要将结果提供给标准签名处理.
我有以下c#代码从私钥生成数字签名:
static string Sign(string text, string certificate)
{
X509Certificate2 cert = new X509Certificate2(certificate, "TestPassword", X509KeyStorageFlags.Exportable);
RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)cert.PrivateKey;
// Hash the data
SHA1Managed sha1 = new SHA1Managed();
ASCIIEncoding encoding = new ASCIIEncoding();
byte[] data = encoding.GetBytes(text);
byte[] hash = sha1.ComputeHash(data);
// Sign the hash
return System.Convert.ToBase64String(rsa.SignHash(hash, CryptoConfig.MapNameToOID("SHA1")));
}
Run Code Online (Sandbox Code Playgroud)
然后我创建了我认为是等效的java代码:
public static String signData(String dataToSign, String keyFile) {
FileInputStream keyfis = null;
try {
keyfis = new FileInputStream(fileName);
KeyStore store = KeyStore.getInstance("PKCS12");
store.load(keyfis, "TestPassword".toCharArray());
KeyStore.PrivateKeyEntry pvk = (KeyStore.PrivateKeyEntry)store.
getEntry("testkey",
new …Run Code Online (Sandbox Code Playgroud) I am trying to sign some data (a POST form) in a web based application using a Java Applet. The user's x509 certificate would be in a cryptoken/smart card. The signature needs to be in attached pkcs#7 format.
I am using this tutorial/code as a starting point in building the applet - http://www.developer.com/java/other/article.php/3587361/Java-Applet-for-Signing-with-a-Smart-Card.htm
The biggest problem for me here seems to be the fact that the applet asks the user for location of the pkcs#11 implementation library. This is a …
我一直在用这个问题敲打墙头约20个小时,我可能会错过一些简单的事情.但是,我已经到了我认为需要帮助的地步.我已经阅读了几十个关于如何解决问题的不同部分的解释,但我无法弄清楚如何将它们整合在一起.
我有一个DER编码的分离式PKCS#7数字签名.签名符合RFC 3852(加密消息语法).对于我的项目,我需要逐步完成验证签名所需的每个步骤,并能够确定验证失败的步骤.我在Java中使用BouncyCastle.
据我了解,验证数字签名需要六个基本步骤
编辑:几条评论要求在列表中添加OSCP检查.
在BouncyCastle测试代码中,我能够找到以下示例.它似乎完成了2/6,然而,它并不清楚它是否完成了任何任务.如果有人能指出我正确的方向完成剩下的任务,我们将不胜感激.
CMSSignedData s = ...
byte[] contentDigest = ...
Store certStore = s.getCertificates();
Store crlStore = s.getCRLs();
SignerInformationStore signers = s.getSignerInfos();
Collection c = signers.getSigners();
Iterator it = c.iterator();
while (it.hasNext())
{
SignerInformation signer = (SignerInformation)it.next();
Collection certCollection = certStore.getMatches(signer.getSID());
Iterator certIt = certCollection.iterator();
X509CertificateHolder cert = (X509CertificateHolder)certIt.next();
assertEquals(true, signer.verify(new JcaSimpleSignerInfoVerifierBuilder().setProvider(BC).build(cert)));
if (contentDigest != null)
{
assertTrue(MessageDigest.isEqual(contentDigest, signer.getContentDigest()));
}
}
Collection certColl = certStore.getMatches(null);
Collection crlColl = crlStore.getMatches(null);
assertEquals(certColl.size(), …Run Code Online (Sandbox Code Playgroud) 我正在用Python编写一个用于椭圆曲线加密的程序(适用于学校和出于兴趣的人)。我目前正在研究数字签名算法。我目前正在寻找一种良好且安全的哈希函数,该函数在Python中是标准的,或者可以轻松下载和导入。我想到了SHA256,因为这是我所知道的唯一一个还没有坏掉的(据我所知)。但是,我也读过SHA不应该用于加密。SHA256是否适合数字签名算法?还是应该使用其他哈希函数?如果是这样,哪个是一个不错的选择?
我正在使用pdfbox示例签名CreateVisableSignature,我希望代码将签名的图像写入第三页上名为"ApplicantSignature"的签名字段.
有人可以提供一个线索,说明为什么它会在第一页的左上角写下签名吗?
这是代码:
public static void main(String[] args) throws KeyStoreException,
NoSuchAlgorithmException, CertificateException,
FileNotFoundException, IOException, COSVisitorException,
SignatureException {
if (args.length != 4) {
usage();
System.exit(1);
} else {
File ksFile = new File(args[0]);
KeyStore keystore = KeyStore.getInstance("PKCS12", provider);
char[] pin = args[1].toCharArray();
keystore.load(new FileInputStream(ksFile), pin);
File document = new File(args[2]);
CreateVisibleSignature signing = new CreateVisibleSignature(
keystore, pin.clone());
String jpgFile = CreateVisibleSignature.convertPngToJpeg( args[3] );
FileInputStream image = new FileInputStream( jpgFile );
PDVisibleSignDesigner visibleSig = new PDVisibleSignDesigner(
args[2], image, 1);
visibleSig.xAxis(0).yAxis(0).zoom(-75)
.signatureFieldName("ApplicantSignature");
PDVisibleSigProperties …Run Code Online (Sandbox Code Playgroud) 我有一个应用程序(不是我的代码),该应用程序在未连接到互联网的服务器上启动缓慢。
从较早的经验中,我知道配置文件中的generatePublisherEvidence,并在这里也进行了尝试(在进程监视器中检测到超时后的一些TCP连接之后)。
但是,在这种情况下,应用程序是.Net 4.5.1,generatePublisherEvidence的文档页面显示
在.NET Framework 4和更高版本中,此元素对程序集加载时间没有影响。
令我惊讶的是,减少了加载时间,并且从日志中消失了TCP连接。
首先,我认为这是一个巧合,但现在我已经在其他2台服务器上验证了相同的行为。
谁能解释一下?
我试图按照msdn页面上的链接进行操作,但找不到有关如何验证程序集证书以及为何CLR2和CLR4之间存在差异的任何信息。
我唯一能想到的是该应用程序加载了一些较旧的CLR2程序集,而这些程序集受generatePublisherEveidence影响。
我正在尝试使用OpenSSL libeay32.dll在Delphi中实现SHA256签名和验证.因此,在第一步中,我使用以下OpenSSL命令创建了一个RSA 2048位密钥对:
openssl genrsa -out private.pem 2048
openssl rsa -in private.pem -outform PEM -pubout -out public.pem
Run Code Online (Sandbox Code Playgroud)
那么容易.我做的下一步是创建一个能够从PEM文件中读取公钥和私钥的函数:
function TSignSHA256.ReadKeyFile( aFileName : String; aType : TKeyFileType ) : pEVP_PKEY;
var locFile : RawByteString;
locBIO : pBIO;
begin
locFile := UTF8Encode( aFileName );
locBIO := BIO_new( BIO_s_file() );
try
BIO_read_filename( locBIO, PAnsiChar(locFile) );
result := NIL;
case aType of
kfPrivate : result := PEM_read_bio_PrivateKey( locBIO, result, nil, nil );
kfPublic : result := PEM_read_bio_PUBKEY( locBIO, result, nil, nil );
end;
finally …Run Code Online (Sandbox Code Playgroud) 我使用PDFsharp和MigraDoc创建一个新的PDF文件。现在,我想添加一个字段,用户可以在其中单击并选择用于数字签名文件的证书。
我在网上发现,使用AcroForms应该可以做到这一点。但是我无法使用,AcroForm因为它始终为null。
我当前的示例代码:
Document document = new Document();
Section section = document.AddSection();
section.AddParagraph("Signature Test");
PdfDocumentRenderer pdfRenderer = new PdfDocumentRenderer(false, PdfFontEmbedding.Always);
pdfRenderer.Document = document;
pdfRenderer.RenderDocument();
// NullPointerException at the following line. AcroForm is null
pdfRenderer.PdfDocument.AcroForm.Elements.Add(PdfAcroForm.Keys.SigFlags, new PdfInteger(3));
const string filename = "HelloWorld.pdf";
pdfRenderer.PdfDocument.Save(filename);
Process.Start(filename);
Run Code Online (Sandbox Code Playgroud)
为什么此属性为null?我该怎么做才能将其设置为正确的值?
或者更好的是,如何添加一个字段来选择数字证书?
java ×6
rsa ×3
bouncycastle ×2
c# ×2
cryptography ×2
pkcs#7 ×2
python ×2
.net ×1
assemblies ×1
delphi ×1
hash ×1
jce ×1
migradoc ×1
openssl ×1
pdfbox ×1
pdfsharp ×1
pkcs#11 ×1
python-3.x ×1
scala ×1
startup ×1