Java:ChaCha20 w/Poly1305 作为通用文件加密的 MAC

问题描述 投票:0回答:1

我需要使用 ChaCha20/Poly1305 对任何来源的任何数据进行通用加密和解密(与我们使用 I/O 流的方式相同,例如 CipherInputStream)。

这个问题已经询问是否可以使用 Bouncy Castle 的 ChaCha20Poly1305 类来处理数据,但似乎只支持 TLS 事务。

所以现在我只剩下纯粹的 ChaCha20 (ChaCha20Engine)。我想知道编写自己的“先加密后MAC”方案是否是一个好主意,这样我就能得到我所需要的东西。

tl;dr 编写我自己的 ChaCha20/Poly1305 加密然后 MAC 操作模式可以吗?

java encryption
1个回答
3
投票

Java 11 添加了“ChaCha20-Poly1305/None/NoPadding 密码” 现在可以在没有任何第三方库或其他魔法的情况下使用 -->

这里有一个参考实现

注意:此实现使用非随机 Nonce,除测试目的外不应使用

package chaCha20Poly1305Encryption;

import javax.crypto.*;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.AlgorithmParameterSpec;
import java.util.Base64;

public class ChaCha20Poly1305 {

    public static byte[] encrypt(byte[] data, SecretKey key) throws NoSuchPaddingException, NoSuchAlgorithmException,
            InvalidAlgorithmParameterException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
        if(key == null) throw new InvalidKeyException("SecretKey must NOT be NULL");
    
        byte[] nonceBytes = new byte[12];
    
        // Get Cipher Instance
        Cipher cipher = Cipher.getInstance("ChaCha20-Poly1305/None/NoPadding");
    
        // Create IvParamterSpec
        AlgorithmParameterSpec ivParameterSpec = new IvParameterSpec(nonceBytes);
    
        // Create SecretKeySpec
        SecretKeySpec keySpec = new SecretKeySpec(key.getEncoded(), "ChaCha20");
    
        // Initialize Cipher for ENCRYPT_MODE
        cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivParameterSpec);
    
        // Perform Encryption
        return cipher.doFinal(data);
    }
    
    public static byte[] decrypt(byte[] cipherText, SecretKey key) throws Exception {
        if(key == null) throw new InvalidKeyException("SecretKey must NOT be NULL");
        byte[] nonceBytes = new byte[12];
    
        // Get Cipher Instance
        Cipher cipher = Cipher.getInstance("ChaCha20-Poly1305/None/NoPadding");
    
        // Create IvParamterSpec
        AlgorithmParameterSpec ivParameterSpec = new IvParameterSpec(nonceBytes);
    
        // Create SecretKeySpec
        SecretKeySpec keySpec = new SecretKeySpec(key.getEncoded(), "ChaCha20");
    
        // Initialize Cipher for DECRYPT_MODE
        cipher.init(Cipher.DECRYPT_MODE, keySpec, ivParameterSpec);
    
        // Perform Decryption
        return cipher.doFinal(cipherText);
    }
    
    public static void main(String[] args) throws Exception {
        SecretKey key = ChaCha20Poly1305KeyGenerator.generateKey();
    
        String testMessage = "hallo!";
        byte[] encryptedBytes = encrypt(testMessage.getBytes(), key);
        String decryptedMessage = new String(decrypt(encryptedBytes,key));
        System.out.println("testMessage: " + testMessage);
        System.out.println(key.getAlgorithm() + " SecretKey: " + Base64.getEncoder().encodeToString(key.getEncoded()));
        System.out.println("encryptedBytes: " + Base64.getEncoder().encodeToString(encryptedBytes));
        System.out.println("decryptedMessage: "+ decryptedMessage);
    
    }
}

以及相应的密钥生成器:

package chaCha20Poly1305Encryption;

import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;

public class ChaCha20Poly1305KeyGenerator {
    public static SecretKey generateKey() throws NoSuchAlgorithmException {
        KeyGenerator keyGenerator = KeyGenerator.getInstance("ChaCha20");
        //Keysize MUST be 256 bit - as of Java11 only 256Bit is supported
        keyGenerator.init(256);
        return keyGenerator.generateKey();
    }
    public static void main(String[] args) throws NoSuchAlgorithmException {
        SecretKey key = generateKey();
        System.out.println(key.getAlgorithm() + " SecretKey: " + Base64.getEncoder().encodeToString(key.getEncoded()));
    }
}

我的 Github Gist 中使用的代码可以在这里找到

© www.soinside.com 2019 - 2024. All rights reserved.