Tag: 数字签名

签署消息并通过Bouncy Castle的恢复消息进行validation

我编写了以下用于签名消息的代码,然后在Bouncy Castle的java中validation它。 正确签署工作但validation不起作用。 代码打印的结果: 签名被篡改 无法恢复 并返回null。 为什么eng.hasFullMessage()函数返回false以及为什么以下代码不起作用? 谢谢大家。 public static String sigVer(PublicKey pu, PrivateKey pr, String original) throws Exception{ //sign BigInteger big = ((RSAKey) pu).getModulus(); byte[] text = original.getBytes(); RSAKeyParameters rsaPriv = new RSAKeyParameters(true, big,((RSAPrivateKey) pr).getPrivateExponent()); RSAKeyParameters rsaPublic = new RSAKeyParameters(false, big,((RSAPublicKey) pu).getPublicExponent()); RSAEngine rsa = new RSAEngine(); byte[] data; Digest dig = new […]

使用Java中的自定义数字签名对Pdf进行签名

我使用Sun的代码创建了一个数字签名: http : //download.oracle.com/javase/tutorial/security/apisign/examples/GenSig.java 。 如何使用此数字签名签署pdf文件? 那就是:如何将签名添加到pdf文件中?

BouncyCastle找不到它提供的算法?

我正在玩BouncyCastle 1.46令我惊讶的是,下面的片段中的捕获块经常被绊倒。 Security.addProvider(new BouncyCastleProvider()); final Set found = new HashSet(); final Set missing = new HashSet(); final DefaultSignatureAlgorithmIdentifierFinder finder = new DefaultSignatureAlgorithmIdentifierFinder(); for (Service service : new BouncyCastleProvider().getServices()) { if (“Signature”.equals(service.getType())) { final String algorithm = service.getAlgorithm(); try { finder.find(algorithm); found.add(algorithm); } catch (IllegalArgumentException ex) { missing.add(algorithm); } } } System.out.println(“Found: ” + found); System.out.println(“Missing: […]

如何使用x509证书生成数字签名?

我们如何获取x509data和x509certificate标记并将其附加到由以下代码生成的xml中 String providerName = System.getProperty(“jsr105Provider”, “org.jcp.xml.dsig.internal.dom.XMLDSigRI”); XMLSignatureFactory fac = XMLSignatureFactory.getInstance(“DOM”, (Provider) Class.forName(providerName).newInstance()); Reference ref = fac.newReference(“”, fac.newDigestMethod(DigestMethod.SHA1, null), Collections.singletonList( fac.newTransform(Transform.ENVELOPED,(XMLStructure) null)), null, null); SignedInfo si = fac.newSignedInfo (fac.newCanonicalizationMethod (CanonicalizationMethod.INCLUSIVE_WITH_COMMENTS, (XMLStructure) null), fac.newSignatureMethod(SignatureMethod.RSA_SHA1, null), Collections.singletonList(ref)); KeyPairGenerator kpg = KeyPairGenerator.getInstance(“RSA”); kpg.initialize(512); KeyPair kp = kpg.generateKeyPair(); KeyInfoFactory kif = fac.getKeyInfoFactory(); KeyValue kv = kif.newKeyValue(kp.getPublic()); KeyInfo ki = kif.newKeyInfo(Collections.singletonList(kv)); […]

替代Chrome下的数字签名小程序

目前,我们已经开发出一个可以使用Java applet对文档进行数字签名的系统。 然而,随着chrome下的applet禁令,我们正在寻找一种替代的数字签名解决方案。 目前签署的工作方式如下: HTTP GET被发送到servlet以获取将要签名的文档; 小程序启动,数字签名驱动程序从文件系统中提取,用户输入PIN; applet获取认证链,检查CRL / OSCP并签署文档; applet将已签名文件的多部分post发送到系统中的servlet。 一种替代解决方案是在浏览器中导入证书并使用js进行签名。 但这不是一个用户友好的解决方案。 另一个解决方案可能是要求用户使用JNLP下载运行程序,该程序下载并签署文档并使用HTTP多部分POST自动上载它。 这种方法的缺点是它需要额外的用户交互(下载操作)并且我们丢失了浏览器http会话,因此我们必须再次进行身份validation。 哪个更可行? 你能想到另类吗?

使用java安全提供程序单独摘要和签名

由于一些实现细节,我需要拆分散列和签名生成。 我尝试使用’NONEwithRSA’签名算法来实现这一点。 这是一个基本的工作示例: public void rsaSignatureIntegrityTest() { KeyPairGenerator gen = KeyPairGenerator.getInstance(“RSA”); gen.initialize(2048, new SecureRandom()); KeyPair pair = gen.generateKeyPair(); byte[] digest = MessageDigest.getInstance(“SHA-256”).digest(MESSAGE); Signature signer = Signature.getInstance(“NONEwithRSA”); signer.initSign(pair.getPrivate()); signer.update(digest); byte[] signed = signer.sign(); Signature verifier = Signature.getInstance(“SHA256withRSA”); verifier.initVerify(pair.getPublic()); verifier.update(MESSAGE); verifier.verify(signed); } 运行此命令, verifier.verify()方法将引发Signatureexception: java.security.SignatureException: Signature encoding error at sun.security.rsa.RSASignature.engineVerify(RSASignature.java:204) at java.security.Signature$Delegate.engineVerify(Signature.java:1219) at java.security.Signature.verify(Signature.java:652) at testing.rsaSignatureIntegrityTest(testing.java:38) … […]

如何RSAvalidation在php中生成的java中的签名

我们使用phpseclib进行公钥签名,android java用于公钥validation。 但它重复失败了。 PHP代码用于生成密钥和通过私钥签名 include_once(“phpseclib/autoload.php”); function getKeys($keysize=2048){ $rsa = new Crypt_RSA(); //$rsa->setPublicKeyFormat(CRYPT_RSA_PUBLIC_FORMAT_OPENSSH); //$rsa->setPublicKeyFormat(CRYPT_RSA_PRIVATE_FORMAT_PKCS1); $rsa->setPrivateKeyFormat(CRYPT_RSA_PRIVATE_FORMAT_PKCS8); $rsa->setPublicKeyFormat(CRYPT_RSA_PUBLIC_FORMAT_PKCS1); $d = $rsa->createKey($keysize); return array(“publickey”=>$d[‘publickey’], “privatekey”=>$d[‘privatekey’]); } function encryptdata($message, $encryptionKey){ $rsa = new Crypt_RSA(); //$rsa->setPublicKeyFormat(CRYPT_RSA_PRIVATE_FORMAT_PKCS1); $rsa->setPrivateKeyFormat(CRYPT_RSA_PRIVATE_FORMAT_PKCS8); $rsa->setPublicKeyFormat(CRYPT_RSA_PUBLIC_FORMAT_PKCS1); //$rsa->setPublicKeyFormat(CRYPT_RSA_PUBLIC_FORMAT_OPENSSH); $rsa->loadKey($encryptionKey); // public key return $rsa->encrypt($message); } function decryptdata($message, $decryptionKey){ $rsa = new Crypt_RSA(); // $rsa->setPublicKeyFormat(CRYPT_RSA_PUBLIC_FORMAT_OPENSSH); // $rsa->setPublicKeyFormat(CRYPT_RSA_PRIVATE_FORMAT_PKCS1); $rsa->setPrivateKeyFormat(CRYPT_RSA_PRIVATE_FORMAT_PKCS8); $rsa->setPublicKeyFormat(CRYPT_RSA_PUBLIC_FORMAT_PKCS1); $rsa->loadKey($decryptionKey); // […]

java.security.NoSuchAlgorithmException:RSA签名不可用

这是例外 线程“main”中的exceptionjava.security.NoSuchAlgorithmException:RSA签名不可用 在java.security.Signature.getInstance(Signature.java:229) 在MailClient.main(MailClient.java:52) 这是我的代码 import java.io.*; import java.net.*; import java.nio.ByteBuffer; import java.util.*; import java.security.*; public class MailClient { public String getMessage(Mail m){ return m.message; } public static void main(String[] args) throws Exception { // Initialisation BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String host = args[0]; int port = Integer.parseInt(args[1]); String userid = args[2]; while(true) […]

Java和.NET互操作(RSA)签名

我正在基于.net的智能卡上签署一些数据,并尝试在java环境中validation该签名 – 但没有成功。 智能卡(c#): RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(1024); // In a different method, rsaParams.Exponent and rsaParams.Modulus are set rsaProvider.ImportParameters(rsaParams); // Here I’m importing the key SHA1 sha1 = SHA1.Create(); byte[] signature = rsaProvider.SignData(data, sha1); 客户端(Java): Signature sig = Signature.getInstance(“SHA1withRSA”); sig.initVerify(rsaPublicKey); // initiate the signature with public key sig.update(data); // update signature with the data […]

使用Java将数字签名添加到PDF

我想使用存储在USB令牌,HSM等上的证书对PDF文件进行数字签名。如何使用JAVA使用存储在USB令牌上的私钥?