如何在Android中没有随机数加密

时间:2015-12-03 01:53:56

标签: android encryption random

我目前有一个使用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;?

1 个答案:

答案 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我的键作为字节[]。以这种方式初始化密码可以避免盐析,并允许您始终使用自己的密钥来加密任何内容。