标签: digital-signature

麻烦在Python和Java/Scala之间插入RSA签名

我正在使用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)

python java scala rsa digital-signature

5
推荐指数
1
解决办法
884
查看次数

将消息和签名转换为BouncyCastle CMSSignedData对象

我有一个X509CertificateObject,一个匹配的RSAPublicKey,并设法创建一个包含某个消息对象的有效数字证书的字节数组,也作为一个字节数组.

不幸的是,我构建的系统只接受CMSSignedData对象作为输入.如何将基本构建块转换为这样的有效CMSSignedData对象?

背景:我正在尝试根据这个例子的 Java Bouncy Castle RSA盲签名(摘要是SHA512)并且需要将结果提供给标准签名处理.

java rsa bouncycastle digital-signature pkcs#7

5
推荐指数
1
解决办法
1479
查看次数

Java数字签名与C#不同

我有以下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)

c# java digital-signature

5
推荐指数
1
解决办法
2804
查看次数

在Java Applet中实现数字签名

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 …

java jce digital-signature pkcs#11 pkcs#7

5
推荐指数
1
解决办法
3949
查看次数

结合验证PKCS#7签名所需的所有任务

我一直在用这个问题敲打墙头约20个小时,我可能会错过一些简单的事情.但是,我已经到了我认为需要帮助的地步.我已经阅读了几十个关于如何解决问题的不同部分的解释,但我无法弄清楚如何将它们整合在一起.

我有一个DER编码的分离式PKCS#7数字签名.签名符合RFC 3852(加密消息语法).对于我的项目,我需要逐步完成验证签名所需的每个步骤,并能够确定验证失败的步骤.我在Java中使用BouncyCastle.

据我了解,验证数字签名需要六个基本步骤

  1. 验证根证书是否为可信证书
  2. 验证从根证书到签名证书的证书链
  3. 验证签名者的姓名是您期望的名称
  4. 验证证书是否已过期
  5. 验证证书是否未出现在CRL上(为简单起见,假设已在本地下载CRL)
  6. 验证签名中的摘要是否与文档的摘要匹配

编辑:几条评论要求在列表中添加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)

java cryptography bouncycastle digital-signature

5
推荐指数
1
解决办法
2197
查看次数

Python中的加密哈希函数

我正在用Python编写一个用于椭圆曲线加密的程序(适用于学校和出于兴趣的人)。我目前正在研究数字签名算法。我目前正在寻找一种良好且安全的哈希函数,该函数在Python中是标准的,或者可以轻松下载和导入。我想到了SHA256,因为这是我所知道的唯一一个还没有坏掉的(据我所知)。但是,我也读过SHA不应该用于加密。SHA256是否适合数字签名算法?还是应该使用其他哈希函数?如果是这样,哪个是一个不错的选择?

python hash cryptography digital-signature python-3.x

5
推荐指数
1
解决办法
2410
查看次数

如何让PDVisibleSigProperties将3页上的签名写入签名框

我正在使用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)

java digital-signature pdfbox

5
推荐指数
1
解决办法
1279
查看次数

CLR4中的generatePublisherEvidence

我有一个应用程序(不是我的代码),该应用程序在未连接到互联网的服务器上启动缓慢。

从较早的经验中,我知道配置文件中的generatePublisherEvidence,并在这里也进行了尝试(在进程监视器中检测到超时后的一些TCP连接之后)。

但是,在这种情况下,应用程序是.Net 4.5.1,generatePublisherEvidence的文档页面显示

在.NET Framework 4和更高版本中,此元素对程序集加载时间没有影响。

令我惊讶的是,减少了加载时间,并且从日志中消失了TCP连接。

首先,我认为这是一个巧合,但现在我已经在其他2台服务器上验证了相同的行为。

谁能解释一下?

我试图按照msdn页面上的链接进行操作,但找不到有关如何验证程序集证书以及为何CLR2和CLR4之间存在差异的任何信息。

我唯一能想到的是该应用程序加载了一些较旧的CLR2程序集,而这些程序集受generatePublisherEveidence影响。

.net assemblies startup digital-signature

5
推荐指数
1
解决办法
464
查看次数

在Delphi中使用OpenSSL验证SHA256签名失败

我正在尝试使用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)

delphi openssl rsa digital-signature

5
推荐指数
1
解决办法
1866
查看次数

为PDF添加数字签名字段

我使用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?我该怎么做才能将其设置为正确的值?

或者更好的是,如何添加一个字段来选择数字证书?

c# pdfsharp digital-signature migradoc

5
推荐指数
1
解决办法
112
查看次数