有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

优选具有java实现的加密算法

我正在寻找一个对称密钥加密方案,将加密我的12字节数据。正如您所看到的,我使用块加密算法不符合64位或128位边界,我不想填充数据,因为我对加密数据的长度有限制。限制是因为我将使用base 32 it转换为一个不能超过20个字符的可打印密钥。纯文本具有非常可预测的数据模式,因此加密方案应该能够隐藏该模式。据我所知,伪随机密钥生成是这个问题的唯一解决方案,但加密数据的解决方案和解密数据的解决方案并不相互通信


共 (3) 个答案

  1. # 2 楼答案

    为什么不使用RC4?密文与明文的大小完全相同——在您的情况下是12字节。它附带Java(5或更高版本)。以下是一个例子:

    import javax.crypto.Cipher;
    import javax.crypto.spec.SecretKeySpec;
    import javax.xml.bind.DatatypeConverter;
    
    public class MyArcFour
    {
       public static void main(String [] args) throws Exception
       {
          byte [] key = "MYVERYINSECUREKEY".getBytes("ASCII");
    
          String clearText = "123456789012";
    
          Cipher rc4 = Cipher.getInstance("RC4");
          SecretKeySpec rc4Key = new SecretKeySpec(key, "RC4");
          rc4.init(Cipher.ENCRYPT_MODE, rc4Key);
    
          byte [] cipherText = rc4.update(clearText.getBytes("ASCII"));
    
          System.out.println("clear (ascii)        " + clearText);
          System.out.println("clear (hex)          " + DatatypeConverter.printHexBinary(clearText.getBytes("ASCII")));
          System.out.println("cipher (hex) is      " + DatatypeConverter.printHexBinary(cipherText));
    
          Cipher rc4Decrypt = Cipher.getInstance("RC4");
          rc4Decrypt.init(Cipher.DECRYPT_MODE, rc4Key);
          byte [] clearText2 = rc4Decrypt.update(cipherText);
    
          System.out.println("decrypted (clear) is " + new String(clearText2, "ASCII"));
       }
    }
    

    这将生成以下输出:

    clear (ascii)        123456789012
    clear (hex)          313233343536373839303132
    cipher (hex) is      CBFB9A712E55EBD985C8F2DF
    decrypted (clear) is 123456789012
    

    当然,您希望使用比示例中更好(更长、更随机)的键

  2. # 3 楼答案

    您可以使用诸如RC4之类的流密码,但正如您所发现的,您不能重用密钥。对于流密码,使用key/nonce(nonce=使用一次的数字)组合。nonce可以像1,2,3,4。。。或日期/时间,需要与密码文本一起存储。在nonce循环舍入为零并开始重复之前更改键。如果使用日期/时间,请确保时钟的滴答声足够快,不会重复某个值

    您有一个长期密钥和一个临时密钥。每次要加密某个内容时,将其散列以获取会话密钥:

    sessionKey <- SHA256(longTermKey + nonce)
    

    仅使用此会话密钥一次,然后将其丢弃。存储用于解密的nonce。为下一次使用准备一个数值临时值。对于日期/时间nonce,插入短延迟以确保时钟已更改。下次使用时,当前值必须不同

    更改长期密钥时,需要对所有数据进行解密和重新加密。或者,为您的当前密钥选择一个较大的位,并将长期密钥保持在非常安全的状态