Tag: 密码学

Java AES / GCM / NoPadding – 什么是cipher.getIV()给我的?

我在Java 8中使用AES/GCM/NoPadding加密,我想知道我的代码是否存在安全漏洞。 我的代码似乎有效 ,因为它加密和解密文本,但一些细节尚不清楚。 我的主要问题是: Cipher cipher = Cipher.getInstance(“AES/GCM/NoPadding”); cipher.init(Cipher.ENCRYPT_MODE, key); byte[] iv = cipher.getIV(); // ????? IV是否满足“对于给定的密钥,IV不得重复”的要求。 来自RFC 4106 ? 我也很感激我对相关问题的任何答案/见解(见下文),但第一个问题最让我烦恼。 我不知道在哪里可以找到解决此问题的源代码或文档。 这是完整的代码,粗略。 如果我在撰写这篇文章时引入了错误,我深表歉意: class Encryptor { Key key; Encryptor(byte[] key) { if (key.length != 32) throw new IllegalArgumentException(); this.key = new SecretKeySpec(key, “AES”); } // the output is sent to users byte[] encrypt(byte[] […]

BadPaddingException:解密错误

我正在编写一个程序,它从控制台输入 – 一个zip文件的名称,一个zip文件的名称,包含从第一个zip生成的(de / en)加密文件和一个包含公钥的文件。 解密时我得到exception: exception Exception in thread “main” javax.crypto.BadPaddingException: Decryption error at sun.security.rsa.RSAPadding.unpadV15(RSAPadding.java:380) at sun.security.rsa.RSAPadding.unpad(RSAPadding.java:291) at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:363) at com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:389) at javax.crypto.Cipher.doFinal(Cipher.java:2165) at com.Main.decrypt(Main.java:67) at com.Main.main(Main.java:201) 无法弄清楚为什么我得到这个例外? 公钥: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCE3pA746UfpC8sFk8ZJp0yupyJqj5jy6cjdxUYoP7mCm7c0mqQDeCcDNBYW2eSozCioPrH/9L+CDQEPLYakoem+jFnUKDH5+pru/0PJTJJF8Xh/ZT9eJlvsYBr1/qSfICf6RTs7kzwq9IuSZBw7/tfNEF9i0A8FVox6HOopXod1QIDAQAB 私钥: MIICXQIBAAKBgQCE3pA746UfpC8sFk8ZJp0yupyJqj5jy6cjdxUYoP7mCm7c0mqQDeCcDNBYW2eSozCioPrH/9L+CDQEPLYakoem+jFnUKDH5+pru/0PJTJJF8Xh/ZT9eJlvsYBr1/qSfICf6RTs7kzwq9IuSZBw7/tfNEF9i0A8FVox6HOopXod1QIDAQABAoGANOFrYBqK5lvu1koOswDWQZFZqcSSzh8IZyoGwGWa7S0r0EECXlDXmuPSq8e9IfRG8ALHrH+ZlrbnFOSgyVSWHfpj3aH+qknoSX5TW2rMQHih8865xuqheMQ+RTZ7+BRDqNsYkzxB/Z8mqzpoJQSYf+H7nWxdDCgAJVYZzxl3DmUCQQD32iEjnwiwUjii8slcmvCEZl+z84DWNdvJOg6Z38sI4AvrfpKc1WAcDg1rNZCKrRgokh54wpLt08cpFcrD04c3AkEAiTzDmc0bdgfg5wj6xHFZpYlBwiGm/bjOR2PS57P0GNU5PsDllRbFqIuzArITutO5lvZZImzuYz7Lf+cQ73pxUwJBAOdEwmdaneDo17A0m2+to3/nhqWDMVSwLMU3RyiNigZeCMFU+bkd4PBMrHi9IoJDwacZsRU9eZwxYEUV8H2Jg0ECQEEkOqRSm2pXKwX/WSjNtQPCNxhy6NUeV6vDUmTxIjh3XYjP/ynZeVEbnoj1BjB0N2/U11Jj6nPpZqb7gyppMEkCQQCoGdVYDipU+hMMnvxa0zOIyQc/a+HE0lESqn+2ZPafYi9Z1RldRMvUXhP8U7s+OuhRwprdw2ivvOFrnWyz9lL2 该程序的代码如下。 任何帮助都很受欢迎:) package com; import java.io.BufferedReader; import java.io.FileOutputStream; import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.security.GeneralSecurityException; import java.security.KeyFactory; import java.security.PrivateKey; import java.security.PublicKey; […]

分解RSA / ECB / OAEPWITHSHA-256ANDMGF1PADDING

所以Java有一个名为RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING 。 那有什么意思? RFC3447 , 公钥加密标准(PKCS)#1:RSA加密规范版本2.1 ,第7.1.2节解密操作说Hash和MGF都是RSAES-OAEP-DECRYPT的选项。 MGF是它自己的function,在B.2.1节MGF1中定义,并且它也有自己的Hash“选项”。 也许RSAES-OAEP-DECRYPT和MGF1中的Hash“选项”应该是相同的,或者它们可能不是,我不清楚。 如果他们是那么我猜你有RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING这意味着sha256应该用于两者。 但如果它们不应该是相同的那么你可以将sha256用于RSAES-OAEP-DECRYPT,例如,sha1用于MGF1。 如果是这种情况那么sha256应该用于什么function呢? 什么哈希算法应该用于其他function? 欧洲央行在这方面的意义是什么? ECB是对称分组密码模式。 电子密码本。 也许它应该意味着Java如何处理比模数更大的明文? 就像将明文拆分成与模数一样大的块,然后用RSA加密每个块并将它们连接在一起? 我猜…

使用Java中的RSA私钥加密

我正在尝试使用RSA私钥加密某些内容。 我正在关注这个例子: http : //www.junkheap.net/content/public_key_encryption_java 但转换它使用私钥而不是公共。 在这个例子之后,我认为我需要做的是: 读入DER格式的私钥 生成PCKS8EncodedKeySpec 从KeyFactory调用generatePrivate()来获取私钥对象 将该私钥对象与Cipher对象一起使用以进行加密 那么,步骤: 密钥是从openssl生成的: openssl genrsa -aes256 -out private.pem 2048 然后转换为DER格式: openssl rsa -in private.pem -outform DER -out private.der 我用以下代码生成PKCS8EncodedKeySpec: byte[] encodedKey = new byte[(int)inputKeyFile.length()]; try { new FileInputStream(inputKeyFile).read(encodedKey); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // […]

使用Java进行AES加密和解密

这是我正在做的,看起来有点笨拙,但任何帮助对此问题表示赞赏。 我收到BadPaddingException 。 阅读几乎所有相关主题,但没有找到合适的解决方案。 我是加密解密编程的新手,需要在我的一个Java应用程序中实现它。 谢谢..这是代码看起来如何…. public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException { // TODO Auto-generated method stub String FileName=”encryptedtext.txt”; String FileName2=”decryptedtext.txt”; String pad=”0″; KeyGenerator KeyGen=KeyGenerator.getInstance(“AES”); KeyGen.init(128); SecretKey SecKey=KeyGen.generateKey(); Cipher AesCipher=Cipher.getInstance(“AES”); AesCipher.init(Cipher.ENCRYPT_MODE,SecKey); byte[] byteText=”My name is yogesh”.getBytes(); byte[] byteCipherText=AesCipher.doFinal(byteText); String cipherText = null; try { FileWriter fw=new FileWriter(FileName); BufferedWriter bw=new […]

使用bouncycastle签署和validation签名的正确方法

我使用bcmail-jdk16-1.46.jar和bcprov-jdk16-1.46.jar (Bouncycastle库)来签名string ,然后validationsignature 。 这是我签署string code : package my.package; import java.io.FileInputStream; import java.security.Key; import java.security.KeyStore; import java.security.PrivateKey; import java.security.Security; import java.security.Signature; import java.security.cert.X509Certificate; import java.util.ArrayList; import java.util.List; import org.bouncycastle.cert.jcajce.JcaCertStore; import org.bouncycastle.cms.CMSProcessableByteArray; import org.bouncycastle.cms.CMSSignedData; import org.bouncycastle.cms.CMSSignedDataGenerator; import org.bouncycastle.cms.CMSTypedData; import org.bouncycastle.cms.jcajce.JcaSignerInfoGeneratorBuilder; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.operator.ContentSigner; import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder; import org.bouncycastle.operator.jcajce.JcaDigestCalculatorProviderBuilder; import org.bouncycastle.util.Store; import sun.misc.BASE64Encoder; public class SignMessage { […]

CryptoJS AES加密和Java AES解密

我只是问这个,因为我已经阅读了很多关于加密AES加密的post2天了,就在我认为我得到它的时候,我意识到我根本没有得到它。 这篇文章是我最接近我的问题,我有完全相同的问题,但没有答案: CryptoJS AES加密和JAVA AES解密值不匹配 我试过很多方面,但我没有把它做对。 首先 我正在获取已经加密的字符串(我只有代码才能看到它们是如何做的),因此修改加密方式不是一种选择。 这就是为什么所有类似的问题对我都没有用。 第二 我有权访问密钥,我可以修改它(所以如果需要,调整长度是一个选项)。 加密是在CryptoJS上完成的,它们将加密的字符串作为GET参数发送。 GetParamsForAppUrl.prototype.generateUrlParams = function() { const self = this; return new Promise((resolve, reject) => { const currentDateInMilliseconds = new Date().getTime(); const secret = tokenSecret.secret; var encrypted = CryptoJS.AES.encrypt(self.authorization, secret); encrypted = encrypted.toString(); self.urlParams = { token: encrypted, time: currentDateInMilliseconds }; resolve(); }); }; 我可以使用CryptoJS在javascript上轻松解密这个: […]

如何列出可用的密码算法?

我正在使用Cipher.getInstance(String algorithm)获得Cipher实现。 我的印象是,我可能传递的可用算法名称因我的类路径中存在的库而异。 我想编写一个简单的程序,我可以使用不同的类路径运行,列出可用的Cipher算法名称。 获取此列表需要调用哪种方法?

如何使用Java从CryptoJS解密加密的AES-256字符串?

我有来自CryptoJS的加密AES-256字符串和密码短语。 我需要用Java解密它,但无法弄清楚如何做到这一点。 您似乎需要IV,密钥和salt来解密,并且在CryptoJS主页中 ,加密数据已经包含所有这些,并且CryptoJS可以以某种方式将它们从加密输入中解析出来。 谁知道怎么做? 我已经看到了很多关于CryptoJS的例子 – Java加密/解密,但大多数都使用硬编码的IV /密钥,或者只是将密码/密钥从cryptoJS端发送到Java端。 我所拥有的只是一个密码,就像这个网站所做的那样!

处理加密exception

在Java中处理加密\解密时,这个非常基本的代码段很常见。 final Cipher cipher = Cipher.getInstance(“AES/CBC/NoPadding”); cipher.init(Cipher.ENCRYPT_MODE, key, iv); cipher.doFinal(*something*); 仅这三行,可能会抛出六个exception,我不确定处理它们的最干净(在代码可读性方面)是什么。 尝试六个catch子句对我来说真的很像。 在使用这些物体时,是否有微图案或最佳实践,我显然是缺失的? 编辑 对不起,我想我没有很好地解释自己。 我的问题不是关于避免try \ catch子句,而是如果有一种常见的方法来处理类似的情况。 例外情况是 NoSuchPaddingException, NoSuchAlgorithmException InvalidAlgorithmParameterException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException