1

嗯,这实际上是一个两部分...

首先我需要

  1. 读取文件的内容
  2. 将它们加密成一个byte[]
  3. 将文件写入byte[]文件或其他...

然后#2 或#3 的结果将进入另一个项目。我正在尝试保护我们的 PEM/DER 密钥。

对于解密,我需要

  1. 读取加密文件的内容作为byte[]
  2. 将它们解密为byte[]
  3. 将解密的数据写入文件或使用它而不是文件

现在,我有一些基本的加密代码

        KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
    keyGenerator.init(128); // 192 and 256 bits may not be available

    SecretKey secretKey = keyGenerator.generateKey();

    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");


    // By initializing the cipher in CBC mode, an "initialization vector" has been randomly
    // generated. This initialization vector will be necessary to decrypt the encrypted data.
    // It is safe to store the initialization vector in plain text for later use. You can obtain
    // it's bytes by calling iv.getIV().
    cipher.init(Cipher.ENCRYPT_MODE, secretKey);
    IvParameterSpec iv = cipher.getParameters().getParameterSpec(IvParameterSpec.class);
        //      IvParameterSpec iv = new IvParameterSpec(IV); //used for the hardcoded one

        byte[] encryptedData = cipher.doFinal(data);

并解密一个

    cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
    byte[] decryptedData = cipher.doFinal(encryptedData);
    System.out.println("decrypted: " + new String(decryptedData));

问题是:

给定一个用例场景,其中一个人很少加密某些东西并且会分发要在运行时解密的加密密钥,除了密文之外,我还需要保存什么?

我知道我需要保存 IV,但是当我解密时不太好 - 这让我相信我也需要保存 secretKey。

谁能给我任何提示、指示或一般安全提示,以获得更好的解决方案?如果我需要保存密钥、IV 和加密数据,我应该将它们存储在哪里?也许硬编码密钥并将IV与加密数据一起存储?也许对 IV 和密钥都进行硬编码,并将加密数据存储在文件中?

这与理论上的安全无关,将其视为您可能对试图窃取您的钥匙的人造成的最大麻烦和不便。我们都知道我无法完美地隐藏它们。

我非常需要这个人从解密加密文件并在 Java 中执行开始的内容

但是,如果有更好的方法将安全数据输入 PemKeyReader,我会全力以赴。

4

2 回答 2

1

共享密钥和加密某些东西是完全不同的两件事。如何共享密钥

话虽如此,AES128 位的加密算法比 128 位的加密算法要强,3DES所以您可以做的是保持PKI基础设施到位以进行交换AES keys,然后使用它们进行加密和解密。

为什么不RSA呢?RSA需要至少 512 位才能将其视为最强,如果增加更多位,则会增加加密和解密所需的时间。

所以 AES 快速且安全。

使用SecretKeySpec从 byte[] 创建密钥

public static void main(String[] args) throws Exception
{
    // Initialise secret key with predefined byte array [] like below. I
    // have used simple string to array method to generate 16 byte array.
    // AES Key must be minimum 16 bytes.
    // Now you can put this byte array some where is .SO file.
    // Generate new Key using this byte []
    // Then you can generate a key using device specific information at
    // first boot up.
    // Use second key to encrypt data and first key to encrypt the second
    // key
    // I Hope it clears all the doubts
    SecretKey key = new SecretKeySpec("ABCDEFGHIJKLMNOP".getBytes(), "AES");
    System.out.println(Arrays.toString(key.getEncoded()));
    // Initialise Cipher with AES Algorithm
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    // Set The Encrypt Mode
    cipher.init(Cipher.ENCRYPT_MODE, key);
    // Encrypt some bytes
    byte[] encrypted = cipher.doFinal("ABCDEFGH".getBytes());
    // Print it to vefiry
    System.out.println(Arrays.toString(encrypted));

    // Get The IV
    byte[] iv = cipher.getIV();
    System.out.println(iv.length);
    // Now why storing you can create structure like [16 IV][Encrypted Data]
    // And while decrypting you can read first [16] bytes IV and then
    // decrypt remaining bytes

    //byte[] iv = new byte[16];
    // System.arraycopy(encrypted, 0, iv, 0, 16)
    //Copy remaining bytes to decrypt


    // set cipher to decrypt mode

    cipher.init(Cipher.DECRYPT_MODE, key,new IvParameterSpec(iv));

    // decrypt it
    byte[] decrypted = cipher.doFinal(encrypted);
    System.out.println(new String(decrypted));

}

现在编写一个算法,它将从一些随机数据(如设备名称、用户名、随机种子等)生成 byte[]。

C您可以通过将算法写入并创建.SO文件并开始byte []使用来为算法源代码添加更多保护Native calls

做这一切有什么好处?

  1. 事件如果您的 so 被黑客入侵,它将需要实时环境来运行创建密钥。
  2. 即使有人确实破解了它,损坏也将是有限的,即 1 台设备
  3. 黑客将不得不对每台设备重复相同的操作,这是极不可能做到的。
于 2012-08-21T11:03:00.053 回答
1

您的问题的 I/O 方面最好通过阅读 Oracle Java 教程的“字节流”“缓冲流”部分来解决。您可以通过将字节写入 a 来累积内存中的字节ByteArrayOutputStream,然后使用该toByteArray()方法将字节获取为byte[].

于 2012-08-21T11:22:26.727 回答