生成 DES 密钥并使用密码进行加密

Ben*_*min 1 java cryptography

我想用 java 学习密码学,我在互联网上找到了 这些幻灯片。在第 9 页上,我找到了一个示例,并尝试使用它。但是,以下代码未编译。错误在哪里?

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;

public class Gen_DESAES_key{


byte[] message = "Hello World".getBytes();

KeyGenerator keygenerator = KeyGenerator.getInstance("DES");
SecretKey desKey = keygenerator.generateKey();

Cipher desCipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
desCipher.init(Cipher.ENCRYPT_MODE,deskey);

byte[] encryptedMessage = desCipher.doFinal(message);
}
Run Code Online (Sandbox Code Playgroud)

cas*_*lin 5

修复 #1:修复变量名称

Java 中的变量名区分大小写。您的变量名称是desKey而不是deskey

修复 #2:将代码包装到方法中并处理异常

除此之外,您必须将代码包装到一个方法中,如下所示:

import javax.crypto.*;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

public class Gen_DESAES_key {

    public static void main(String[] args) throws NoSuchAlgorithmException,
                                                  NoSuchPaddingException,
                                                  BadPaddingException,
                                                  IllegalBlockSizeException,
                                                  InvalidKeyException {

        byte[] message = "Hello World".getBytes();

        KeyGenerator keygenerator = KeyGenerator.getInstance("DES");
        SecretKey desKey = keygenerator.generateKey();

        Cipher desCipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
        desCipher.init(Cipher.ENCRYPT_MODE, desKey);

        byte[] encryptedMessage = desCipher.doFinal(message);
        System.out.println(new String(encryptedMessage));
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,您的代码将抛出一堆异常,这些异常必须由try-catch块处理或在throws方法的子句中声明。有关更多详细信息,请参阅文档

奖励 #1:使用 Base64

为了避免在显示加密消息时出现一些奇怪的字符,您可以使用Base64 对其进行编码。如果您使用的是 Java 8 或更高版本,则可以使用java.util.Base64

System.out.println(Base64.getEncoder().encodeToString(encryp??tedMessage));
Run Code Online (Sandbox Code Playgroud)

奖励 #2:解密您的消息

要解密您的加密消息,请使用:

desCipher.init(Cipher.DECRYPT_MODE, desKey);
byte[] decryptedMessage = desCipher.doFinal(encryptedMessage);

System.out.println(new String(decryptedMessage));
Run Code Online (Sandbox Code Playgroud)