以下示例使用AES加密给定的数据块。加密密钥以安全的方式派生(随机盐,1000轮SHA-256)。加密使用具有随机IV的CBC模式下的AES。
请注意,存储在类数据EncryptedData(salt,iv,和encryptedData)可以被级联以单个字节数组。然后,您可以保存数据或将其传输给收件人。
private static final int SALT_BYTES = 8; private static final int PBK_ITERATIONS = 1000; private static final String ENCRYPTION_ALGORITHM = "AES/CBC/PKCS5Padding"; private static final String PBE_ALGORITHM = "PBEwithSHA256and128BITAES-CBC-BC"; private EncryptedData encrypt(String password, byte[] data) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeySpecException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, InvalidAlgorithmParameterException { EncryptedData encData = new EncryptedData(); SecureRandom rnd = new SecureRandom(); encData.salt= new byte[SALT_BYTES]; encData.iv= new byte[16]; // AES块大小 rnd.nextBytes(encData.salt); rnd.nextBytes(encData.iv); PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray(), encData.salt, PBK_ITERATIONS); SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(PBE_ALGORITHM); Key key = secretKeyFactory.generateSecret(keySpec); Cipher cipher = Cipher.getInstance(ENCRYPTION_ALGORITHM); IvParameterSpec ivSpec = new IvParameterSpec(encData.iv); cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec); encData.encryptedData= cipher.doFinal(data); return encData; } private byte[] decrypt(String password, byte[] salt, byte[] iv, byte[] encryptedData) throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, InvalidAlgorithmParameterException { PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray(), salt, PBK_ITERATIONS); SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(PBE_ALGORITHM); Key key = secretKeyFactory.generateSecret(keySpec); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); IvParameterSpec ivSpec = new IvParameterSpec(iv); cipher.init(Cipher.DECRYPT_MODE, key, ivSpec); return cipher.doFinal(encryptedData); } private static class EncryptedData { public byte[] salt; public byte[] iv; public byte[] encryptedData; }
以下示例代码显示了如何测试加密和解密:
try { String password = "test12345"; byte[] data = "plaintext11223344556677889900".getBytes("UTF-8"); EncryptedData encData = encrypt(password, data); byte[] decryptedData = decrypt(password, encData.salt, encData.iv, encData.encryptedData); String decDataAsString = new String(decryptedData, "UTF-8"); Toast.makeText(this, decDataAsString, Toast.LENGTH_LONG).show(); } catch (Exception e) { e.printStackTrace(); }
问题内容: 有没有一个很好的示例,说明如何在Android上使用AES 加密和解密图像及其他文件? 问题答案: 并像这样调用它们: 这应该可行,我现在在项目中使用类似的代码。
本文向大家介绍Android使用KeyStore对数据进行加密的示例代码,包括了Android使用KeyStore对数据进行加密的示例代码的使用技巧和注意事项,需要的朋友参考一下 谈到 Android 安全性话题,Android Developers 官方网站给出了许多很好的建议和讲解,涵盖了存储数据、权限、网络、处理凭据、输入验证、处理用户数据、加密等方方面面 密钥的保护以及网络传输安全 应该是
Java为URL编码字符串提供了类。但是将密码存储为字符串被认为是不安全的。通过输出流通过POST发送密码的代码是否足够安全? 一方面,它在使用字符串。另一方面,这些字符串只有1个字符长,编码后在概念上是相同的。而且,在我看来,这可能会在多字节字符上失败。攻击者是否能够在内存中找到这些1-char字符串并重建原始密码?有没有更好的办法做到这一点?
问题内容: 我今天刚找到pycrypto,并且一直在研究AES加密课程。不幸的是,它只能成功一半。self.h.md5以十六进制格式输出md5哈希,并且为32byte。这是输出。似乎是对消息进行了解密,但是它在解密后放置了随机字符,在这种情况下,是\ n \ n \ n …我认为self.data的块大小有问题,有人知道如何解决此问题吗? Jans-MacBook-Pro:test2 jan $
问题内容: 我之所以写这个问题+答案,是因为我挣扎了很多(也许是因为缺乏经验),并迷失了使用node或python进行加密/解密的许多不同方式。 我以为我的案子将来可以帮助人们。 我需要做的是: 从表单获取数据,使用Crypto(node-js)对其进行加密 在Python中传递加密的数据,然后使用PyCrypto将其解密。 我选择使用AES加密。 这是我的开始方式(我不会尝试的所有事情): 我遵
问题内容: 这是我正在做的事情,可能看起来有些笨拙,但是可以帮助您解决该问题。我得到一个。阅读几乎所有相关主题,但找不到合适的解决方案。我是加密解密程序设计的新手,需要在我的Java应用程序之一中实现它。 谢谢..这就是代码的样子.... 问题答案: 在这里,您需要了解的是密文可能包含不可打印的字符。因此,当您使用readLine()时,它可能不会为您提供文件中的所有字节。 同样,它并没有给您您认