Tag: 加密

什么是较便宜的哈希算法?

我对哈希算法知之甚少。 我需要在将文件转发到远程系统(有点像S3)之前计算Java中的传入文件的哈希值,这需要MD2 / MD5 / SHA-X中的文件哈希。 出于安全原因,不会计算此哈希,而只是为了一致性校验和。 我可以使用Java标准库的DigestInputStream在转发文件时实时计算此哈希值,但是想知道最好使用哪种算法来避免使用DigestInputStream的性能问题? 我的一位前同事测试并告诉我们,与unix命令行或文件相比,计算hash实时可能非常昂贵。 关于过早优化的编辑:我在一家公司工作,目的是帮助其他公司取消他们的文件。 这意味着我们有一个处理来自其他公司的文件传输的批次。 我们将来每天定位数百万份文档,实际上,此批次的执行时间对我们的业务非常敏感。 每天100万个文档的散列优化10毫秒是每天执行时间缩短3小时,这是非常巨大的。

如何从java中的eToken访问证书

我想在插入时从eToken读取证书,当我将证书存储在本地机器上时,我可以通过我的java应用程序读取它,但是,我不知道如何从eToken中读取它。 RSAPublicKey pub; String fileName = “C:\\myCert.cer”; InputStream inStream = new FileInputStream(fileName); CertificateFactory cf = CertificateFactory.getInstance(“X.509”); X509Certificate cert = (X509Certificate)cf.generateCertificate(inStream); inStream.close(); pub = (RSAPublicKey) cert.getPublicKey(); System.out.println(cert.getIssuerDN()); System.out.println(cert.getSubjectDN()); System.out.println(cert.getSubjectAlternativeNames()); byte [] tempPub = pub.getEncoded(); String sPub = new String( tempPub );

Java AES解密BadPaddingException

注意:Java NOOB。 好吧,我知道这里已经回答了几十次,但解决方案似乎不能直接应用于我理解它们的地方。 (是的,我知道我不完全理解加密/解密,AES等等,但这不是重点,我试图理解这一点) 我有一个实用程序api,我想传递一个字符串并返回一个加密的字符串。 然后我想传递加密的字符串,并返回一个解密的字符串。 简单。 它适用于我传入的许多字符串,但在某些字符串上,我得到exceptionjavax.crypto.BadPaddingException: Given final block not properly padded. 例如,以下加密/解密很好。 util/encrypt/?token=123456789012wha = 4TR0CbCcQKqeRK73zr83aw == util/decrypt/?token=4TR0CbCcQKqeRK73zr83aw== = 123456789012wha 以下加密,但不解密: util/encrypt/?token=123456789012what = NYaWmwnySoGNHyNmY9Jh + f3O2rqoLI1IAcnsl5V4OCE = util/decrypt/?token=NYaWmwnySoGNHyNmY9Jh+f3O2rqoLI1IAcnsl5V4OCE= = exception 这是我的控制器中的代码: private static final String ALGO = “AES”; @RequestMapping(value = “/util/encrypt/”, method = RequestMethod.GET) @ResponseBody public String encrypt(HttpServletResponse httpResponse, @RequestParam(value = “token”, required=true) […]

线程“main”中的exceptionjava.security.UnrecoverableKeyException:给定最终块未正确填充

大家好我用AES加密,我所做的是我在文本文件中加密数据并存储给定位置,如果在同一个类文件中给出解密工作正常,我创建了一个不同的java类来解密该文件,我使用带有用户名和密码的Javakeystore来存储密钥并检索它并使用存储的密钥进行解密,但是我收到了上述错误。 帮帮我们。 这是解密的代码。 import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.security.Key; import java.security.KeyStore; import java.security.Security; import javax.crypto.Cipher; import javax.crypto.CipherInputStream; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import de.flexiprovider.core.FlexiCoreProvider; public class Decrypto { public static void main(String[] args) throws Exception { Security.addProvider(new FlexiCoreProvider()); /* * Cipher cipher1 = Cipher.getInstance(“AES128_CBC”, “FlexiCore”); * KeyGenerator keyGen = KeyGenerator.getInstance(“AES”, “FlexiCore”); * SecretKey secKey […]

何时加密需要填充?

我在这里问了一个问题, 为什么AES java解密会返回额外的字符? 关于解密加密数据时获取额外字符的问题。 感谢用户“Ebbe M. Pedersen”的评论,我现在明白问题是在PHP和Android Java代码中都没有使用相同的填充机制。 所以我将Java代码更改为 Java代码 public class encryption { private String iv = “fedcba9876543210”;//Dummy iv (CHANGE IT!) private IvParameterSpec ivspec; private SecretKeySpec keyspec; private Cipher cipher; private String SecretKey = “0123456789abcdef”;//Dummy secretKey (CHANGE IT!) public encryption() { ivspec = new IvParameterSpec(iv.getBytes()); keyspec = new SecretKeySpec(SecretKey.getBytes(), “AES”); try { cipher = […]

Android解密:最终确定密码时出错

我使用Android来加密和加密应用之间发送的图像。 加密效果很好但是当文件到达目的地时它不会解密。 现在我已经在目标应用程序中复制了该文件,并使用第三方软件成功解密了该文件。 我得到的错误是:在IllegalBlockSizeException引起的CipherInputStream(CipherInputStream.java:107)中“最终确定密码时出错”。 加密和解密代码如下: public static String encrypt(String plainFile, String encryptedFile) throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException { // Here you read the cleartext. File extStore = Environment.getExternalStorageDirectory(); FileInputStream fis = new FileInputStream(plainFile); // This stream write the encrypted text. This stream will be wrapped by // another stream. FileOutputStream fos = new FileOutputStream(encryptedFile); // […]

如何使用另一个字符串作为密码加密/解密字符串?

我正在制作一个简单的程序,它在文本框中输入文本,并获取另一个文本框中的密码,然后对其进行某种简单加密并将其保存到文件中。 之后,用户应该能够再次打开文件并提供用于加密的密码,并且应该吐出原始文本。 现在我正在拿绳子。 将其分隔为char数组,然后对密码执行相同操作。 之后,我获取密码,将所有这些字符转换为整数,找到所有字符的平均值,并将其用作原始文本中字符的偏移量。 有一些像: textChars[1]= (char)((int)textChars[1]+offset); 然后我可以反过来加密字符串: encryptedChars[1]= (char)((int)encryptedChars[1]-offset); 问题是字符在不同的平台上有不同的值,所以有时偏移会将字符变成一些疯狂的数字(如负值),这只会将字符变成问号。 我查看了标准Java API中的加密库,但是如果密钥只是在每次启动程序时随机生成,我会感到困惑。 我需要的是两个看起来像String encrypt(String text,String Password)函数String encrypt(String text,String Password) ,它将用密码加密的文本作为解密它的密钥,以及String decrypt(String encryptedText, String Password)将吐出原始函数文字(如果密码是垃圾,则为乱码) 任何帮助都非常感谢,这实际上只是一个个人项目,所以我不需要任何花哨的加密方法。

RSA / NONE / PKCS1Padding给出java.security.NoSuchAlgorithmException错误

我使用“RSA / None / PKCS1Padding”作为: Cipher RSACipher = Cipher.getInstance(“RSA/None/PKCS1Padding”); 这给了我例外: java.security.NoSuchAlgorithmException: Cannot find any provider supporting RSA/None/PKCS1Padding 感谢帮助。

在加密字节后从Cipher获取更新的IV

我正在开发一个需要附加到AES / CTR加密文件的项目。 现在,由于它是计数器模式,我知道我可以将计数器推进到任何位置并开始读取文件中的位置。 我想知道的是,如果有一种方法让我获取Cipher在使用后可以访问的当前IV。 Cipher c = Cipher.getInstance(“AES/CTR/NoPadding”); SecretKeySpec keySpec = new SecretKeySpec(aeskey, “AES”); IvParameterSpec ivSpec = new IvParameterSpec(iv); c.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec); CipherOutputStream cipher_out = new CipherOutputStream(output, c); try { while (true) { cipher_out.write(input.readByte()); } } catch (EOFException e) { } byte curIV[] = c.getIV(); 相反,我发现curIV而不是更新的IV具有与我开始进入ivSpec相同的IV。 有没有办法得到目前的IV? 想法是存储: 在非对称加密文件中,这种方式可以解密,读取,我们可以从头开始读取AES加密文件,或者我们可以使用我们存储的将新数据附加到输出文件中。 关于如何实现这个的任何其他建议? Java根据我发现的文档使用以下(接近RFC3686 ): 作为其输入CTR,并更新计数器,它被认为是一个大端数。 这是作为上面看到的IvParameterSpec提供的。 […]

RSA加密Android和Java环境之间的差异

首先,为我即将发布的代码量道歉。 我正在尝试使用我的Java应用程序中的RSA公钥来加密Android应用程序中的消息,然后将密文发送回Java环境进行解密,但在尝试解密时,我总是会收到此错误: 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:356) at com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:382) at javax.crypto.Cipher.doFinal(Cipher.java:2087) … 密文确实包含正确的字节数(512),因此看到“填充错误”exception会让人感到困惑。 SO上的其他类似post建议使用“RSA / ECB / PKCS1Padding”作为算法,但这不起作用。 令人讨厌的是,Android环境中的加密和解密(使用Base64.URL_SAFE作为’base64Type’)工作正常,我似乎无法使用通过Java生成的公钥进行初始加密。 我已经将最小的代码提取到示例中,如下所示: Android代码 private void exampleMethod(){ String messageString = “Why does this not work in Android?”; String serverPubKey = “MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoApIBIna77xq4j+M2RmyIhsB++41NHcY4KIPfX4VP4ADnkO+7ejbs4le/twrPtYGESVPF9czSMB5bzmTBZtq0jC8oT/6wiDIBlSuzo4fBrGociBIuaOjyG/j3ZhpcWpWPXuzER+ehuQ+8hZkMuJdK9IodqPR+5jmCef4rXoKObwS02LYQ1co5dEmtZVQRmmeYaVnWibd/s1d4KKGvSzXap3YBTf8peH5UGIQrLOTqvX0bo34xFxmj5U0H3xudnnwuVAlQlj9KiHPPABuwNtm1buRKJb5HZhSCveyT/2YAOmQqGrVN/nALtlZyTDZNs//Vp1zb9exSuG0t5xFc+pn4QIDAQAB”; String encryptedMessageString = getUrlEncodedCipherText(messageString, serverPubKey, Base64.NO_WRAP); /** * CipherText is ALWAYS the same […]