Tag: cryptography

如何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); // […]

使用此椭圆曲线点乘法计算的点不在曲线上,并且此类带来算术exception

我使用标准投影坐标得到了我的点乘法误差。 我不知道我错过了什么,但是乘法点不在曲线上,有时它会输出类似算术exception的东西:整数不可逆。 public class ECPointArthimetic { EllipticCurve ec; private BigInteger x; private BigInteger y; private BigInteger z; private BigInteger zinv; private BigInteger one = BigInteger.ONE; private BigInteger zero = BigInteger.ZERO; private boolean infinity; public ECPointArthimetic(EllipticCurve ec, BigInteger x, BigInteger y, BigInteger z) { this.ec = ec; this.x = x; this.y = y; // Projective coordinates: […]

如何使用新的Bouncy Castle库从PKCS10CertificationRequest获取PublicKey?

在新版本的Bouncy Castle库中, PKCS10CertificationRequest发生了PKCS10CertificationRequest 。 在以前的版本中,可以使用getPublicKey()方法从此类请求获取PublicKey (请参阅旧文档 )。 现在这种方法消失了。 如何通过此类请求获取PublicKey? 有getSubjectPublicKeyInfo().parsePublicKey()但它返回ASN1Primitive 。 我从SPKAC NetscapeCertRequest看到我仍然可以通过调用getPublicKey()直接读取PublicKey。

在BouncyCastle上使用数字签名算法(ECDSA)实现的椭圆曲线

我正在尝试实现ECDSA(椭圆曲线数字签名算法),但我在Java中找不到任何使用Bouncy Castle的例子。 我创建了密钥,但我真的不知道我应该使用什么样的函数来创建签名并validation它。 public static KeyPair GenerateKeys() throws NoSuchAlgorithmException, NoSuchProviderException, InvalidAlgorithmParameterException { ECParameterSpec ecSpec = ECNamedCurveTable.getParameterSpec(“B-571”); KeyPairGenerator g = KeyPairGenerator.getInstance(“ECDSA”, “BC”); g.initialize(ecSpec, new SecureRandom()); return g.generateKeyPair(); }

PKCS#7登录并validation标志

我正在尝试使用PKCS#7签名并validation标志。 我正在跟着用Java开始加密的书。 我已经编写了示例代码来签名和validation。 当我试图附加签名并将其写入文件然后尝试validation我得到exception时(下面给出例外) 我想知道如何将这个签名数据写入文件? 我是否还需要将密钥库分享给将validation该标志的第二人? org.bouncycastle.cms.CMSException:message-digest属性值与计算值不匹配 在org.bouncycastle.cms.SignerInformation.doVerify(未知来源) at org.bouncycastle.cms.SignerInformation.verify(Unknown Source) at org.bouncycastle.cms.SignerInformation.verify(Unknown Source) 在com.inc.cms.test.bc.Test.isValidSignature(Test.java:150) 在com.inc.cms.test.bc.Test.verifyData(Test.java:120) 在com.inc.cms.test.bc.Test.main(Test.java:78) 非常感谢 我的代码如下 请帮我解决这个问题。 非常感谢 `package com.inc.cms.test.bc; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.math.BigInteger; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.KeyStore; import java.security.PrivateKey; import java.security.PublicKey; import java.security.SecureRandom; import java.security.cert.CertPathBuilder; import java.security.cert.CertStore; import java.security.cert.Certificate; import java.security.cert.CollectionCertStoreParameters; import java.security.cert.PKIXBuilderParameters; import java.security.cert.PKIXCertPathBuilderResult; […]

AES / CBC / PKCS5Padding问题

我正在尝试加密和解密一些简单的文本。 但由于某种原因,我收到一个奇怪的错误: javax.crypto.BadPaddingException 。 为什么JCE会生成未正确填充的字节? 我有以下代码: import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.spec.IvParameterSpec; import java.security.SecureRandom; public class SimplestTest { public static void main(String[] args) throws Exception { SecureRandom rnd = new SecureRandom(); String text = “Hello, my dear! … ” + System.getProperty(“user.home”); byte[] textData = text.getBytes(); IvParameterSpec iv = new IvParameterSpec(rnd.generateSeed(16)); KeyGenerator generator = […]

AES密钥派生函数

我有一个使用openssl加密数据的bash脚本,以及解密结果的Java代码。 基于我之前的post ,我现在能够在openssl中输入密码,并将生成的密钥/ iv复制到Java中。 这依赖于在openssl中使用-naltalt选项。 我想删除该选项,并从openssl获取密码/ salt / iv并将其传递给JDK密钥派生函数。 这是我正在使用的openssl脚本: #!/bin/bash openssl enc -aes-128-cbc -in test -out test.enc -p 当我运行它并输入密码时,它会打印出以下内容。 salt=820E005048F1DF74 key=16023FBEB58DF4EB36229286419F4589 iv=DE46F8904224A0E86E8F8F08F03BCC1A 当我在Java中尝试相同的密码/ salt / iv时,我无法解密test.enc。 我在这篇文章中根据@erickson的答案尝试了Java代码。 这是片段。 SecretKeyFactory factory = SecretKeyFactory.getInstance(“PBKDF2WithHmacSHA1”); KeySpec spec = new PBEKeySpec(password, salt, 1024, 128); SecretKey tmp = factory.generateSecret(spec); SecretKey secret = new SecretKeySpec(tmp.getEncoded(), “AES”); Cipher cipher = Cipher.getInstance(“AES/CBC/PKCS5Padding”); […]

使用Java的RSA加密/解密

我正在做一个简单的程序来使用Java中的RSA算法进行加密/解密。 我创建一个密码对象如下: //Create a Cipher object Cipher rsaCipher = Cipher.getInstance(“RSA/ECB/NoPadding”); 我通过调用加密函数来进行加密: String cipher=encrypt(textByte, pair, rsaCipher); System.out.println(“The Encryption using RSA Algorithm : “+cipher); 并解密为: //Decryption String plain=decrypt(Base64.decodeBase64(cipher),pair, rsaCipher); System.out.println(“The Decryption using RSA Algorithm : “+plain); 当我显示输出时,解密输出在原始文本之前返回一个长空格: 但是,当我编辑用于创建Cipher对象的代码时://创建一个密码对象Cipher rsaCipher = Cipher.getInstance(“RSA”); 即,删除操作模式和填充参数,问题得到解决,输出变为: 问题出在哪儿。 在第一种情况下(当空间出现时),我指定了NoPadding? 为什么空格出现在解密的消息中? 即使我使用填充,我预计这不应该发生。 编辑:这是加密和解密方法: public static String encrypt(byte[] textBytes, KeyPair pair, Cipher rsaCipher) throws […]

手动validationXML签名

我可以成功地进行手动引用validation(规范化每个引用的元素 – > SHA1 – > Base64 – >检查它是否与DigestValue内容相同)但是我对SignatureValue的validation失败了。 这是规范化和散列的SignedInfo: d2cIarD4atw3HFADamfO9YTKkKs= YR/fZlwJdw+KbyP24UYiyDv8/Dc= Ater删除标签之间的所有空格(以便将整个元素放在一行上),我获得了这个sha1摘要(在Base64中): 6l26iBH7il / yrCQW6eEfv / VqAVo = 现在我希望在解密SignatureValue内容后找到相同的摘要,但我得到一个不同且更长的值: MCEwCQYFKw4DAhoFAAQU3M24VwKG02yUu6jlEH + u6R4N8Ig = 这是decyption的一些java代码: DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = dbf.newDocumentBuilder(); Document doc = builder.parse(new File(inputFilePath)); NodeList nl = doc.getElementsByTagName(“ds:SignatureValue”); if (nl.getLength() == 0) { throw new Exception(“Cannot find SignatureValue element”); } String […]

如何解密签名的pgp加密文件?

如何使用BouncyCastle Java API解密和validation使用PGP加密的文件?