Android 如何使用安卓加密

Android 如何使用安卓加密,android,encryption,aes,Android,Encryption,Aes,我想用密钥和Iv加密字符串。但我没有得到正确的加密。谁能告诉我怎么做。 我的字符串是abc,但当解密字符串时,它包含特殊字符。 我点击了这个链接: 输出:Tag_en:5b49ac218b93ee5315c25a0e40b3e9de42e6ecadf0827062b22d4421da99dc5a 标签:abc�������������������������� 您可以使用以下函数: private static byte[] encrypt(byte[] raw, byte[] clear)

我想用密钥和Iv加密字符串。但我没有得到正确的加密。谁能告诉我怎么做。 我的字符串是abc,但当解密字符串时,它包含特殊字符。 我点击了这个链接:

输出:Tag_en:5b49ac218b93ee5315c25a0e40b3e9de42e6ecadf0827062b22d4421da99dc5a
标签:abc��������������������������

您可以使用以下函数:

private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception {
    SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
    byte[] encrypted = cipher.doFinal(clear);
    return encrypted;
}

private static byte[] decrypt(byte[] raw, byte[] encrypted) throws Exception {
    SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.DECRYPT_MODE, skeySpec);
    byte[] decrypted = cipher.doFinal(encrypted);
    return decrypted;
}
然后像这样调用它们:

ByteArrayOutputStream baos = new ByteArrayOutputStream();  
bm.compress(Bitmap.CompressFormat.PNG, 100, baos); // bm is the bitmap object   
byte[] b = baos.toByteArray();  

byte[] keyStart = "this is a key".getBytes();
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
sr.setSeed(keyStart);
kgen.init(128, sr); // 192 and 256 bits may not be available
SecretKey skey = kgen.generateKey();
byte[] key = skey.getEncoded();    

// encrypt
byte[] encryptedData = encrypt(key,b);
// decrypt
byte[] decryptedData = decrypt(key,encryptedData);

这应该行得通,我现在在一个项目中使用类似的代码。

试试这段代码,它适合我

private final String AES_MODE = "AES/CBC/PKCS7Padding";

private byte[] Encryption(final SecretKeySpec key, final byte[] iv, final byte[] message) throws GeneralSecurityException {
    final Cipher cipher = Cipher.getInstance(AES_MODE);
    IvParameterSpec ivSpec = new IvParameterSpec(iv);
    cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);
    byte[] cipherText = cipher.doFinal(message);
    return cipherText;
}

好吧,我想这可能是你的十六进制编码/解码,但他们的工作。因此,我编写了一些快速加密,并针对您的类进行了测试

问题是你的填充物。我不明白为什么要将字符串填充到长度16,但无法打印的是附加到字符串中的空字符。因此,要么不填充字符串,要么在解密过程中去掉填充空值,以重建加密的字符串


为了清晰、可维护性和可重用性,您实际上应该在每个方法中只执行一个清晰的逻辑操作,即在将字符串传递给加密方法之前,应该进行填充,因此加密方法只需加密。

您将对明文填充两次,一次是自己手动填充,另一次是使用PKCS5P添加。只需使用由Cipher对象完成的PKCS5P添加。完全无视James的评论(顺便说一句,这是非常正确的),像鹦鹉一样重新发布标题,我想知道你打算用它实现什么。。。
ByteArrayOutputStream baos = new ByteArrayOutputStream();  
bm.compress(Bitmap.CompressFormat.PNG, 100, baos); // bm is the bitmap object   
byte[] b = baos.toByteArray();  

byte[] keyStart = "this is a key".getBytes();
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
sr.setSeed(keyStart);
kgen.init(128, sr); // 192 and 256 bits may not be available
SecretKey skey = kgen.generateKey();
byte[] key = skey.getEncoded();    

// encrypt
byte[] encryptedData = encrypt(key,b);
// decrypt
byte[] decryptedData = decrypt(key,encryptedData);
private final String AES_MODE = "AES/CBC/PKCS7Padding";

private byte[] Encryption(final SecretKeySpec key, final byte[] iv, final byte[] message) throws GeneralSecurityException {
    final Cipher cipher = Cipher.getInstance(AES_MODE);
    IvParameterSpec ivSpec = new IvParameterSpec(iv);
    cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);
    byte[] cipherText = cipher.doFinal(message);
    return cipherText;
}