Tag: 密码学

随机访问加密数据AES GCM模式

随机访问AES CTR模式有一个很好的例子,它可以工作: 在android中使用AES CTR模式随机访问InputStream private static final int AES_BLOCK_SIZE = 16; private static IvParameterSpec calculateIVForOffset(final IvParameterSpec iv, final long blockOffset) { final BigInteger ivBI = new BigInteger(1, iv.getIV()); final BigInteger ivForOffsetBI = ivBI.add(BigInteger.valueOf(blockOffset / AES_BLOCK_SIZE)); final byte[] ivForOffsetBA = ivForOffsetBI.toByteArray(); final IvParameterSpec ivForOffset; if (ivForOffsetBA.length >= AES_BLOCK_SIZE) { ivForOffset = new IvParameterSpec(ivForOffsetBA, ivForOffsetBA.length – AES_BLOCK_SIZE, […]

解密文件的内容时返回不同的字节

所以我决定扩展我在密码学方面的知识,但我有以下代码来加密文件的内容,然后解密它。 我的问题是,当我解密内容并比较我拥有的两个字节数组(原始和解密的内容)时,我有两个不同的数组,甚至是内容。 你们中的任何人都可以发现我的代码中可能有什么问题吗? 原始内容是基本64位解码字节数组。 public class KeyStoreHelper { public static byte[] decryptAES(FileInputStream fis, byte[] key) throws IOException { CipherInputStream cin = null; try { byte[] keyBytes = getKeyBytes(key); Cipher aesCipher = Cipher.getInstance(“AES/CBC/PKCS5Padding”); SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, “AES”); IvParameterSpec ivParameterSpec = new IvParameterSpec(keyBytes); aesCipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec); byte[] buffer = new byte[1024]; ByteArrayInputStream cipherIn = new […]

AES 256-CBC上的密钥和iv问题

我从Python获得了加密的base64字符串。 格式为AES 256 CBC,但是当我尝试使用Android解密时,它将解密的字符串作为nil返回。 python # coding=utf-8 import base64 from random import choice from string import letters try: from Crypto import Random from Crypto.Cipher import AES except ImportError: import crypto import sys sys.modules[‘Crypto’] = crypto from crypto.Cipher import AES from crypto import Random class AESCipher(object): def __init__(self, key): self.bs = 32 self.key = key def […]

使用“RSA / ECB / PKCS7Padding”与Bouncy Castle

我尝试使用“RSA / ECB / PKCS7Padding”进行加密。 JCE不支持它。 所以我下载了Bouncy Castle,但似乎Bouncy Castle也不支持这种转变。 以下代码: Security.insertProviderAt(new BouncyCastleProvider(), 1); Cipher cipher = Cipher.getInstance(“RSA/ECB/PKCS7Padding”); 投 Caused by: java.security.NoSuchAlgorithmException: Cannot find any provider supporting RSA/ECB/PKCS7Padding at javax.crypto.Cipher.getInstance(Cipher.java:524) …. Caused by: javax.crypto.NoSuchPaddingException: Unsupported padding PKCS7Padding at sun.security.pkcs11.P11RSACipher.engineSetPadding(P11RSACipher.java:129) at javax.crypto.Cipher$Transform.setModePadding(Cipher.java:360) at javax.crypto.Cipher.getInstance(Cipher.java:517) … 4 more 我做得对吗? TIA。

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) […]

如何将GCM身份validation标记放在密码流的末尾,在解密期间需要内部缓冲?

在Java中,“默认”AES / GCM提供程序SunJCE将在解密过程中内部缓冲1) 用作输入的加密字节或2) 作为结果产生的解密字节 。 执行解密的应用程序代码会注意到Cipher.update(byte[])返回一个空字节数组,而Cipher.update(ByteBuffer, ByteBuffer)返回写入长度为0.然后当进程完成时, Cipher.doFinal()将返回所有已解码的字节。 第一个问题是:哪个字节被缓冲,上面的数字1或数字2? 我假设缓冲仅在解密期间发生而不是加密,因为首先,在我的Java客户端执行从磁盘读取的文件的加密时,不会发生由此缓冲(稍后描述)引起的问题,它总是发生在服务器端,接收这些文件并进行解密。 其次,这里也是如此。 仅根据我自己的经验判断,我无法确定,因为我的客户端使用CipherOutputStream 。 客户端未明确使用Cipher实例上的方法。 因此,我无法推断是否使用了内部缓冲,因为我无法看到更新和最终方法返回的内容。 当我从客户端传输到服务器的加密文件变大时,我出现了真正的问题。 我的意思是超过100 MB。 接下来发生的是Cipher.update()抛出一个OutOfMemoryError 。 显然由于内部缓冲区的增长和增长。 此外,尽管内部缓冲并且没有从Cipher.update()接收到结果字节,但Cipher.getOutputSize(int)会不断报告不断增长的目标缓冲区长度。 因此,我的应用程序代码被迫分配一个不断增长的ByteBuffer ,它被提供给Cipher.update(ByteBuffer,ByteBuffer)。 如果我试图欺骗并传入容量较小的字节缓冲区,则update方法抛出一个ShortBufferException #1 。 知道我创建巨大的字节缓冲区是没有用的是非常令人沮丧。 鉴于内部缓冲是所有邪恶的根源,那么我在这里应用的明显解决方案是将文件分成块,每个1 MB – 我从来没有问题发送小文件,只有大文件。 但是,我很难理解为什么内部缓冲首先发生。 以前链接的SO答案说GCM:s认证标签是“在密文末尾添加的”,但它“不必放在最后”这种做法是“弄乱了GCM的在线性质”解密”。 为什么将标签放在最后只会扰乱服务器的解密工作? 这是我的推理方式。 要计算身份validation标记,或者MAC(如果愿意),客户端使用某种哈希函数。 显然, MessageDigest.update()不使用不断增长的内部缓冲区。 然后在接收端,服务器不能做同样的事情吗? 对于初学者来说,他可以解密字节,尽管是未经validation的字节,将这些字节提供给他的哈希算法的更新function,当标签到达时,完成摘要并validation客户端发送的MAC。 我不是一个加密的人,所以请跟我说话,好像我既愚蠢又疯狂,但又爱得足以照顾一些=)我全心全意地感谢你花时间阅读这个问题,甚至可能会有所启发! 更新#1 我不使用AD(关联数据)。 更新#2 编写了使用Java演示AES / GCM加密的软件,以及Java EE中的安全远程协议 (SRP)和二进制文件传输。 前端客户端使用JavaFX编写,可用于动态更改加密配置或使用块发送文件。 在文件传输结束时,会显示一些有关传输文件所用时间和服务器解密时间的统计信息。 该存储库还有一个文档,其中包含我自己的一些GCM和Java相关研究。 享受: […]

使用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) … […]

PBEKeySpec对iterationCount和keyLength参数有何影响?

深入研究java加密和散列世界,我看到了PBEKeySpec类的构造函数示例,其中包含iterationCount和keyLength参数的各种值。 似乎没有什么能解释这些参数的影响或意义。 我假设keyLength是密钥的长度,因此密钥长度的32位加密值为32,但这种假设感觉不对。 我对iterationCount猜测是每个char加密的次数,也不再感受到对这个假设的喜爱。 欢迎链接到信息或解释。

Java AES:没有安装的提供程序支持此密钥:javax.crypto.spec.SecretKeySpec

我正在尝试设置128位AES加密,并且我在Cipher.init上抛出一个exception: No installed provider supports this key: javax.crypto.spec.SecretKeySpec 我正在使用以下代码在客户端生成密钥: private KeyGenerator kgen; try { kgen = KeyGenerator.getInstance(“AES”); } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } kgen.init(128); } SecretKey skey = kgen.generateKey(); 然后,此密钥将作为标头传递给服务器。 使用此函数进行Base64编码: public String secretKeyToString(SecretKey s) { Base64 b64 = new Base64(); byte[] bytes = b64.encodeBase64(s.getEncoded()); return new String(bytes); } […]

RSA加密 – 解密:BadPaddingException:数据必须从零开始

我很遗憾地问你关于这么多问题的技巧。 我有一个关于RSA crypthography的问题。 我已经检查了有关此问题的其他主题,但我没有找到任何有用的答案。 我希望你能帮助我。 我想读取一个文件,将其包含,然后解密并将这些解密的字节放在一个新文件中。 我实际上可以: – 获取文件的字节 – 加密它 我有一个例外:javax.crypto.BadPaddingException:数据必须从零开始。 这是我的代码: package com.bodom.ghosty; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import java.io.*; import java.math.BigInteger; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.security.*; import java.security.spec.InvalidKeySpecException; import java.security.spec.RSAPrivateKeySpec; import java.security.spec.RSAPublicKeySpec; import java.util.Scanner; public class EncryptionUtil { private final PrivateKey privateKey; […]