Tag: aes

使用密码短语的CBC的Java AES

我想用Java实现256密钥AES和CBC加密。 收件人发送了256位密码作为字符串’absnfjtyrufjdngjvhfgksdfrtifghkv’,它使用这个openssl命令完美地工作: echo test | openssl enc -aes-256-cbc -a -k ‘absnfjtyrufjdngjvhfgksdfrtifghkv’ base64格式的输出为:U2FsdGVkX1 / yA4J8T + i1M3IZS + TO / V29rBJNl2P88oI = 当我描述它时,它返回原始输入字符串: echo U2FsdGVkX1/yA4J8T+i1M3IZS+TO/V29rBJNl2P88oI= | openssl enc -d -aes-256-cbc -a -k ‘absnfjtyrufjdngjvhfgksdfrtifghkv’ 我的问题是我无法使我的加密工作在java中并使用上面的命令解密它。 我知道我的密钥应该使用我的密码生成。 下面是我的代码示例,其中IV是随机生成的,密钥是使用密码和随机盐生成的。 byte[] input = “test”.getBytes(); String passphrase = “absnfjtyrufjdngjvhfgksdfrtifghkv”; int saltLength = 8; SecureRandom random = new SecureRandom(); //randomly generate salt […]

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

GSSexception:不支持/启用具有HMAC SHA1-96的加密类型AES256CTS模式

将我们的域用户设置为支持Kerberos令牌(Windows Server 2008R2)的AES加密后,在Web应用程序服务器端,我们会收到以下exception: GSSException:GSS-API级别未指定失败(机制级别:不支持/启用HMAC SHA1-96的加密类型AES256CTS模式) 奇怪的是,我们有Java 6(1.6.0_27),这意味着应该支持AES,根据这个文档: http ://docs.oracle.com/javase/6/docs/technotes/guides/security/jgss/jgss- 的features.html 我们的网络应用程序或Java或第三方缺少什么想法? 我们正在使用Spring安全Kerberos扩展(使用最少的代码修改来适应我们当前的Spring 2.x版本和其他身份validation要求)。

想要使用带有32字节的AES 256 CBC,但它显示了java.security.InvalidAlgorithmParameterException

我正在使用AES 256 CBC。 我有32个字节的IV。 但是,当我运行它时,它显示一个例外: Exception in thread “main” java.lang.RuntimeException: java.security.InvalidAlgorithmParameterException: Wrong IV length: must be 16 bytes long at com.abc.aes265cbc.AESUtil.decrypt(AESUtil.java:50) at com.abc.aes265cbc.Security.main(Security.java:48) Caused by: java.security.InvalidAlgorithmParameterException: Wrong IV length: must be 16 bytes long at com.sun.crypto.provider.CipherCore.init(CipherCore.java:430) at com.sun.crypto.provider.AESCipher.engineInit(AESCipher.java:217) at javax.crypto.Cipher.implInit(Cipher.java:790) at javax.crypto.Cipher.chooseProvider(Cipher.java:848) at javax.crypto.Cipher.init(Cipher.java:1347) at javax.crypto.Cipher.init(Cipher.java:1281) at com.abc.aes265cbc.AESUtil.decrypt(AESUtil.java:47) … 1 more 我不知道如何解决这个问题。 我搜索了但是我没有得到如何解决这个问题。 我是第一次尝试安全概念。 我的AES […]

是AES密钥随机?

可以通过此代码生成AES密钥 KeyGenerator kgen = KeyGenerator.getInstance(“AES”); kgen.init(128); 但 如果我有一个“非常可靠”的方法来生成随机数,我可以用这种方式使用它 SecureRandom rnd = new SecureRandom(); byte[] key = new byte[16]; rnd.nextBytes(key); 这种方法可靠获得的关键是什么? 或者它只能由一些SPECIAL算法生成

解密在android上加密的桌面上的数据

我有一个应用程序,它加密一些文本字符串,然后将它们写入文件。 应用程序的桌面版本正在读取文件并解密数据。 问题是,无论何时我在桌面版本上解密,我都会得到一个“javax.crypto.BadPaddingException:给定最终块没有正确填充” 应用程序和桌面都使用相同的代码: import java.security.SecureRandom; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; public class SSL { private final static String HEX = “0123456789ABCDEF”; public static String encrypt(Session current, String cleartext) throws Exception { byte[] rawKey = getRawKey(current.getCurrentSession().getBytes()); byte[] result = encrypt(rawKey, cleartext.getBytes()); return toHex(result); } public static String decrypt(Session current, String encrypted) throws […]

为什么桌面AES文件IO与Android AES文件IO不兼容?

我已将Android应用程序移植到桌面,使用AES加密某些私有数据。 两个应用程序都能够加密和解密数据供自己使用,但无法解密其他应用程序数据。 AES密钥,IV和算法是相同的。 这两个应用程序的主要区别在于android-sdk附带了BouncyCastle提供程序,已经添加到安全性,而桌面应用程序需要 Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); Android应用: public class AesFileIo { public final static String EOL = “\n”; public static final String AES_ALGORITHM = “AES/CTR/NoPadding”; public static final String PROVIDER = “BC”; private static final SecretKeySpec secretKeySpec = new SecretKeySpec(AES_KEY_128, “AES”); private static final IvParameterSpec ivSpec = new IvParameterSpec(IV); public String readAesFile(Context c, String fileName) […]

InvalidKeyException java.security.InvalidKeyException:没有安装的提供程序支持此键:(null)

我有两个类,一个是主类,另一个是AES的实现。 但是,在我的AES类中,我有一个解密字符串的方法,但每当我运行它时,它都会产生exception 我的加密方法工作正常但我的解密方法不能按预期工作。 代码 private Cipher aesCipherForDecryption; String strDecryptedText = new String(); public String decryptAES(final String ciphertext) { try { aesCipherForDecryption = Cipher.getInstance(“AES/CBC/PKCS5PADDING”); aesCipherForDecryption.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(iV)); byte[] byteDecryptedText = aesCipherForDecryption.doFinal(byteCipherText); strDecryptedText = new String(byteDecryptedText); } catch (IllegalBlockSizeException e) { System.out.print(“IllegalBlockSizeException ” +e); } catch (BadPaddingException e) { System.out.print(“BadPaddingException “+e); } catch (NoSuchAlgorithmException e) { […]

每条消息都需要Cipher.init()吗?

假设两个客户端来回交换安全消息。 每次都必须为每条消息运行此块,或者在开始时只执行一次任何步骤: cipher = Cipher.getInstance(“AES/CBC/PKCS5Padding”); cipher.init(Cipher.ENCRYPT_MODE, keySpec); output = cipher.doFinal(content); 我想提供一些上下文 – 虽然我还没有完全理解内部,但我的理解是,为了安全起见,更改每条消息的IV非常重要。 所以我认为这个问题的答案将取决于该步骤是在doFinal()阶段或init()….的引擎盖下发生的?

如何在java服务器端解密cryptojs AES加密消息?

我有以下基于cryptojs的javascript加密/解密函数,它们运行得非常好。 我使用随机盐,随机iv值和特定密码,同时使用cryptpjs加密消息。 我重复使用相同的salt,iv和密码来生成密钥,同时解密加密的消息。 这部分效果很好.. function encrypt(){ var salt = CryptoJS.lib.WordArray.random(128/8); var iv = CryptoJS.lib.WordArray.random(128/8); console.log(‘salt ‘+ salt ); console.log(‘iv ‘+ iv ); var key128Bits = CryptoJS.PBKDF2(“Secret Passphrase”, salt, { keySize: 128/32 }); console.log( ‘key128Bits ‘+ key128Bits); var key128Bits100Iterations = CryptoJS.PBKDF2(“Secret Passphrase”, salt, { keySize: 128/32, iterations: 100 }); console.log( ‘key128Bits100Iterations ‘+ key128Bits100Iterations); var encrypted = […]