在哪种情况下哪一个更受青睐?
我想看看各种模式的评估crtieria列表,也许可以讨论每个标准的适用性.
例如,我认为其中一个标准是加密和解密的"代码大小",这对于微代码嵌入式系统(如802.11网络适配器)非常重要.如果实现CBC所需的代码远小于CTR所需的代码(我不知道这是真的,这只是一个例子),那么我就能理解为什么使用较小代码的模式会更受欢迎.但是,如果我正在编写一个在服务器上运行的应用程序,并且我使用的AES库无论如何都实现了CBC和CTR,那么这个标准就无关紧要了.
请参阅"每个标准的评估标准和适用性列表"的含义?
这与编程无关,但与算法有关.
我需要实现256位AES加密,但我在网上找到的所有示例都使用"KeyGenerator"生成256位密钥,但我想使用自己的密码.如何创建自己的密钥?我已经尝试将其填充为256位,但后来我得到一个错误,说密钥太长了.我确实安装了无限管辖区补丁,所以那不是问题:)
IE浏览器.KeyGenerator看起来像这样......
// Get the KeyGenerator
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128); // 192 and 256 bits may not be available
// Generate the secret key specs.
SecretKey skey = kgen.generateKey();
byte[] raw = skey.getEncoded();
Run Code Online (Sandbox Code Playgroud)
编辑
我实际上是将密码填充到256个字节,而不是位,这太长了.以下是我现在使用的一些代码,我对此有更多的经验.
byte[] key = null; // TODO
byte[] input = null; // TODO
byte[] output = null;
SecretKeySpec keySpec = null;
keySpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
cipher.init(Cipher.ENCRYPT_MODE, keySpec);
output = cipher.doFinal(input)
Run Code Online (Sandbox Code Playgroud)
您需要自己做的"TODO"位:-)
几年前,当我第一次被引入ASP.net和.NET Framework时,我构建了一个非常简单的在线文件存储系统.该系统使用Rijndael加密来存储服务器硬盘上加密的文件,并使用HttpHandler解密并将这些文件发送到客户端.
作为我的第一个使用ASP.net和数据库的项目之一,我不了解整个事情是如何工作的(以及陷入Jeff Atwood在这个主题上描述的相同陷阱),我决定将新生成的密钥和IV存储在一起与数据库中的每个文件条目.
为了使事情更加清晰,加密只是为了保护文件不被直接访问服务器,并且密钥不是由用户输入的密码生成的.
我的问题是,假设我不想为所有文件保留一个密钥,我应该如何存储加密密钥以获得最佳安全性?什么是最佳做法?(即:在不同的服务器上,在纯文本文件上,加密).
此外,这种加密算法中使用的初始化向量是什么?它应该在系统中保持不变吗?
这是我正在做的事情,看起来有点笨拙,但任何帮助都对这个问题表示赞赏.我得到了一个BadPaddingException
.阅读几乎所有相关主题,但没有找到合适的解决方案.我是加密解密编程的新手,需要在我的一个Java应用程序中实现它.
谢谢..这是代码看起来如何....
public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
// TODO Auto-generated method stub
String FileName="encryptedtext.txt";
String FileName2="decryptedtext.txt";
String pad="0";
KeyGenerator KeyGen=KeyGenerator.getInstance("AES");
KeyGen.init(128);
SecretKey SecKey=KeyGen.generateKey();
Cipher AesCipher=Cipher.getInstance("AES");
AesCipher.init(Cipher.ENCRYPT_MODE,SecKey);
byte[] byteText="My name is yogesh".getBytes();
byte[] byteCipherText=AesCipher.doFinal(byteText);
String cipherText = null;
try {
FileWriter fw=new FileWriter(FileName);
BufferedWriter bw=new BufferedWriter(fw);
bw.write(byteCipherText.toString());
bw.close();
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
FileReader fr=new FileReader(FileName);
BufferedReader br=new BufferedReader(fr);
cipherText=br.readLine();
br.close();
} catch (FileNotFoundException …
Run Code Online (Sandbox Code Playgroud) 我在C#中有以下代码.它使用AES对称算法对字节数组进行编码.我需要编写相当于此代码的Java.
class Program
{
static void Main(string[] args)
{
string a = "ABCDEFGHIJKLMNOP";
byte[] bytes = Encoding.ASCII.GetBytes(a);
byte[] cipher = encode(bytes, "1111111122222222111111112222222211111111222222221111111122222222", "66666666555555556666666655555555");
}
private static byte[] encode(byte[] toEncrypt, string sKey, string sIV)
{
byte[] IV = new byte[16];
byte[] key = new byte[32];
byte[] array = new byte[toEncrypt.Length];
string s;
for (int i = 0; i < IV.Length; ++i)
{
s = sIV.Substring(i * 2, 2);
IV[i] = Convert.ToByte(s, 16);
}
for (int i = 0; i < key.Length; …
Run Code Online (Sandbox Code Playgroud) 我的目标是编写一个Java程序来加密文本文件(cipher text
)AES algorithm
.然后,编写另一个程序来解密该加密文件(cipher text
)以获取纯文本.我想使用相同的密钥(相同的密钥,生成一次,保存在某处,并在加密和解密程序中使用它)进行加密和解密过程.如果我生成密钥并在同一程序中逐行进行加密和解密,那么它可以完美地工作.以下是该工作代码段:
String strDataToEncrypt = new String();
String strCipherText = new String();
String strDecryptedText = new String();
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(128);
SecretKey secretKey = keyGen.generateKey();
Cipher aesCipher = Cipher.getInstance("AES");
aesCipher.init(Cipher.ENCRYPT_MODE,secretKey);
strDataToEncrypt = "any text input";
byte[] byteDataToEncrypt = strDataToEncrypt.getBytes();
byte[] byteCipherText = aesCipher.doFinal(byteDataToEncrypt);
strCipherText = new BASE64Encoder().encode(byteCipherText);
System.out.println("cipher text: " +strCipherText);
aesCipher.init(Cipher.DECRYPT_MODE,secretKey,aesCipher.getParameters());
byte[] byteDecryptedText = aesCipher.doFinal(new BASE64Decoder().decodeBuffer(strCipherText));
strDecryptedText = new String(byteDecryptedText);
System.out.println("plain text again: " +strDecryptedText);
Run Code Online (Sandbox Code Playgroud)
但是,我需要有两个不同的程序(java文件)进行加密和解密.所以,我必须以某种方式生成一个密钥并保存在某个地方.然后对加密和解密程序使用相同的密钥.我怎样才能做到这一点?
EDIT_1
KeyGenerator keyGen = …
Run Code Online (Sandbox Code Playgroud) 我正在尝试为某些文本实现AES加密,我正在寻找一种解决方案,最终归结为一个加密和解密密码.我在这个网站上找到了一个可行的解决方案:简单的Java AES加密/解密示例
import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
public class Encryptor {
public static String encrypt(String key1, String key2, String value) {
try {
IvParameterSpec iv = new IvParameterSpec(key2.getBytes("UTF-8"));
SecretKeySpec skeySpec = new SecretKeySpec(key1.getBytes("UTF-8"),
"AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
byte[] encrypted = cipher.doFinal(value.getBytes());
System.out.println("encrypted string:"
+ Base64.encodeBase64String(encrypted));
return Base64.encodeBase64String(encrypted);
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
public static String decrypt(String key1, String key2, String encrypted) {
try {
IvParameterSpec iv = …
Run Code Online (Sandbox Code Playgroud) aes ×6
encryption ×6
java ×5
cryptography ×3
asp.net ×1
encoding ×1
passwords ×1
secret-key ×1