Tag: aes

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

SSL / TLS中的AES-GCM支持Java 7?

根据Java 7文档以及第三方供应商,Java 7应该支持AES-GCM套件: ibm java 7 java 7 ssl doc 由于将其限制为仅仅AES-GCM密码,我在客户端和服务器之间的协商中遇到了一些无法协商密码的错误。 经过调查,我发现似乎客户端和服务器(tomcat实例)都不支持密码套件。 在客户端上运行一些示例代码以获取输出: // Create an SSLContext that uses our TrustManager SSLContext context = SSLContext.getInstance(“TLS”); context.init(null, trustAllCerts, new SecureRandom()); SSLParameters params = context.getSupportedSSLParameters(); String[] suites = params.getCipherSuites(); System.out.println(“Java version : ” + System.getProperty(“java.runtime.version”)); System.out.println(“Connecting with ” + suites.length + ” cipher suites supported:”); for (int […]

Java AES密文文本大小

我正在使用一种非常标准的Java AES加密/解密方式。 byte[] key = hexStringToByteArray(“C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF”); byte[] message = hexStringToByteArray(“01A0A1A2A3A4A5A6A703020100060001”); SecretKeySpec secretKeySpec = new SecretKeySpec(key, “AES”); // Instantiate the cipher Cipher cipher = Cipher.getInstance(“AES”); cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec); byte[] encrypted = cipher.doFinal(message); cipher.init(Cipher.DECRYPT_MODE, secretKeySpec); byte[] original = cipher.doFinal(encrypted); 如您所见,我使用的是128位密钥和128位消息。 我总是得到我期望的结果,但加密结果总是256位长。 第二个128位始终相同。 截断结果除外,如何确保密码只返回前128位,而不更改前128位? 我觉得我有点混淆块大小的定义。

Python AES解密

我在Java中有以下代码片段,我希望在Python中进行复制。 public class AESDecryption { protected SecretKeySpec getPublicKey() { try { byte[] key = “MuidKeibimbtjph9”.getBytes(“UTF-8”); key = MessageDigest.getInstance(“SHA-256”).digest(key); key = Arrays.copyOf(key, 32); return new SecretKeySpec(key, “AES”); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return null; } public String decrypt(byte[] data) { Cipher cipher = null; try { cipher = […]

Java和PHP之间的加密/解密字符串

我正在使用AES加密来加密和解密服务器端的php和Android应用程序(作为客户端)之间的字符串。 PHP中的加密字符串是: HaxRKnMxT24kCJWUXaVvqDHahzurJQK+sYA4lIHql/U= 在Java中它是: HaxRKnMxT24kCJWUXaVvqD/KMEkJTPTXEcCsHIYGX9TGtCNOHQcJyUURPk8qlgf3 我在PHP脚本中使用phpseclib来进行加密。 我在这里想念的是什么? 这里有相关的Java代码 SecretKeySpec skeySpec = new SecretKeySpec(pad16(pass), “AES”); Cipher c = Cipher.getInstance(“AES”); c.init(Cipher.ENCRYPT_MODE, skeySpec); byte[] out = c.doFinal( input ) 这里的PHP代码: $aes = new Crypt_AES(); $aes->setKey(‘password’); $encrypted_encoded_text = base64_encode($aes->encrypt($plaintext));

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

解密由.NET的RijndaelManaged使用Java加密的字节

我正在尝试解密使用RijndaelManaged of .NET / C#加密的东西,使用Java进行解密。 C#程序不是我的; 我无法将其更改为更具互操作性。 但我知道它是如何加密的: byte[] bytes = new UnicodeEncoding().GetBytes(password); // edit: built-in is 8chars FileStream fileStream = new FileStream(outputFile, FileMode.Create); RijndaelManaged rijndaelManaged = new RijndaelManaged(); CryptoStream cryptoStream = new CryptoStream((Stream) fileStream, rijndaelManaged.CreateEncryptor(bytes, bytes), CryptoStreamMode.Write); 我不知道如何在Java端解密这个。 我发现最接近有用的是这篇博客文章 ,但它对实际细节很清楚,我无法实现解密器。 编辑:我是个白痴,现在有了它的工作。 UnicodeEncoding是UTF-16LE,而我使用的是UTF-8。 在插入密码时切换到正确的编码已修复程序。 我还需要获得BouncyCastle并执行Cipher.getInstance(“AES/CBC/PKCS7Padding”, “BC”); finaledit:这是用Java解密来自.NET的默认 RijndaelManaged流的代码,假设它是使用原始密码作为密钥创建的: Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); String password = “kallisti”; // […]

使用相同的密钥解密AES时BadPaddingException

这是测试人员: public class CryptographySimpleTests extends ActivityTestCase { public void testsCryptographyClass_encryptAndDecrypt() { final String orgVal = “hi world! :D”; final String key = “key”; try { final byte[] encryptKey = Cryptography.deriveAES256Key(key); final byte[] decryptKey = Cryptography.deriveAES256Key(key); //Deviation method Assert.assertTrue(Arrays.equals(encryptKey, decryptKey)); byte[] encrypted = Cryptography.encryptAES(encryptKey, orgVal.getBytes()); Assert.assertFalse(Arrays.equals(encrypted, orgVal.getBytes())); byte[] decrypted = Cryptography.decryptAES(decryptKey, encrypted); Assert.assertTrue(Arrays.equals(orgVal.getBytes(), decrypted)); } catch […]

AES 256位加密 – java.security.InvalidAlgorithmParameterException:错误的IV长度:必须是16个字节长

以下是我的加密逻辑。 虽然我的IV是16字节长,但我仍然会收到无效IV长度的错误。 非常感谢任何帮助 @Override public String encrypt(String dataToEncrypt, String IV) throws Exception{ if(encryptionKey.length() < 10){ encryptionKey = generateEncryptionKey().toString(); } System.out.println("number of IV bytes is "+IV.length()+" "+IV); Cipher cipher = Cipher.getInstance(encrpytionAlgo); SecretKey key = new SecretKeySpec(encryptionKey.getBytes(Charset.forName("UTF-8")), "AES"); cipher.init(Cipher.ENCRYPT_MODE, key,new IvParameterSpec(IV.getBytes(Charset.forName("UTF-8")))); byte[] encryptedTextBytes = cipher.doFinal(dataToEncrypt.getBytes(Charset.forName("UTF-8"))); return new Base64().encodeAsString(encryptedTextBytes); } IV和密钥生成逻辑 @Override public String generateRandomIV(){ Random random = […]