我目前有一个使用AES / CBC的配件,钥匙上没有随机数。相反,消息本身包含一个随机数,密钥是硬编码的。我试图在我的Android上做同样的事情,通过BLE与配件交换。不知怎的,我无法弄清楚如何在不使用随机数的情况下生成Key-class对象。
以下是我希望能够做到的一个例子:
public byte[] encrypt(byte[] key, byte[] input) throws Exception {
Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding ");
cipher.init(Cipher.ENCRYPT_MODE, key);
return cipher.doFinal(input);
}
以下是我尝试的内容:
public byte[] encrypt(byte[] key, byte[] input) throws Exception {
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
SecureRandom secureRandom = new SecureRandom(key);
secureRandom.setSeed(key);
keyGenerator.init(128, secureRandom);
SecretKey secretkey = keyGenerator.generateKey();
Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding ");
cipher.init(Cipher.ENCRYPT_MODE, secretkey);
return cipher.doFinal(input);
}
public byte[] encrypt(byte[] key, byte[] input) throws Exception {
SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES/CBC/NoPadding ");
Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding ");
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
return cipher.doFinal(input);
}
不幸的是,这些都在加密之前改变了密钥。
我如何使用我的密钥"按原样#34;?
答案 0 :(得分:0)
如果您想使用自己的密钥加密而不使用盐或使用任何随机密码,您可以执行以下操作。
byte[] keyBuf= new byte[32];
byte[] b= key.getBytes("UTF-8");
int len= b.length;
if (len > keyBuf.length) len = keyBuf.length;
System.arraycopy(b, 0, keyBuf, 0, len);
SecretKey keySpec = new SecretKeySpec(keyBuf, "AES");
byte[] ivBuf= new byte[16];
IvParameterSpec ivSpec = new IvParameterSpec(ivBuf);
cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
其中key
是我的自定义键作为字符串,b我的键作为字节[]。以这种方式初始化密码可以避免盐析,并允许您始终使用自己的密钥来加密任何内容。