Java 加密方法是如何工作的?

Java 加密方法是如何工作的?,java,encryption,cryptography,Java,Encryption,Cryptography,嗯,我在读关于加密方法的书。我发现有三种类型 散列加密 对称方法 不对称形式 我不理解hasing加密和对称方法中AES的某些部分 哈希加密面临的问题:: 我读到“一旦数据被加密,这个过程就无法逆转或破译”。 我的问题是,如果你只能加密数据却不能解密,为什么会有人使用这种方法?还是我弄错了 AES面临的问题:: 下面是我找到的代码: public class AES { private static SecretKeySpec secretKey; private static

嗯,我在读关于加密方法的书。我发现有三种类型

  • 散列加密
  • 对称方法
  • 不对称形式
  • 我不理解hasing加密和对称方法中AES的某些部分

    哈希加密面临的问题:: 我读到“一旦数据被加密,这个过程就无法逆转或破译”。 我的问题是,如果你只能加密数据却不能解密,为什么会有人使用这种方法?还是我弄错了

    AES面临的问题:: 下面是我找到的代码:

    public class AES {
    
        private static SecretKeySpec secretKey;
        private static byte[] key;
        private static String decryptedString;
        private static String encryptedString;
    
        public static void setKey(String myKey) {
    
            MessageDigest sha = null;
            try {
                key = myKey.getBytes("UTF-8");
                System.out.println(key.length);
                sha = MessageDigest.getInstance("SHA-1");
                key = sha.digest(key);
                key = Arrays.copyOf(key, 16); // use only first 128 bit
                System.out.println(key.length);
                System.out.println(new String(key, "UTF-8"));
                secretKey = new SecretKeySpec(key, "AES");
            } catch (NoSuchAlgorithmException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (UnsupportedEncodingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    
        public static String getDecryptedString() {
            return decryptedString;
        }
    
        public static void setDecryptedString(String decryptedString) {
            AES.decryptedString = decryptedString;
        }
    
        public static String getEncryptedString() {
            return encryptedString;
        }
    
        public static void setEncryptedString(String encryptedString) {
            AES.encryptedString = encryptedString;
        }
    
        public static String encrypt(String strToEncrypt) {
            try {
                Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
                cipher.init(Cipher.ENCRYPT_MODE, secretKey);
                setEncryptedString(Base64.encodeBase64String(cipher.doFinal(strToEncrypt.getBytes("UTF-8"))));
            } catch (Exception e) {
                System.out.println("Error while encrypting: " + e.toString());
            }
            return null;
        }
    
        public static String decrypt(String strToDecrypt) {
            try {
                Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
                cipher.init(Cipher.DECRYPT_MODE, secretKey);
                setDecryptedString(new String(cipher.doFinal(Base64.decodeBase64(strToDecrypt))));
            } catch (Exception e) {
                System.out.println("Error while decrypting: " + e.toString());
            }
            return null;
        }
    }
    
    每个密码分别使用128、192和256位的加密密钥对128位块中的数据进行加密和解密

    因此,在代码中:

    key = Arrays.copyOf(key, 16);
    
    它使用128位密钥,对吗

    但是加密和解密方法中的base64是什么

    public static String encrypt(String strToEncrypt) {
        try {
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
            cipher.init(Cipher.ENCRYPT_MODE, secretKey);
            setEncryptedString(Base64.encodeBase64String(cipher.doFinal(strToEncrypt.getBytes("UTF-8"))));
        }
    }
    

    我不会详细阅读您提供的代码,但会以最简单的方式回答您的问题

    如果我们想在某处保存密码并保持加密,我们将使用哈希算法。你的问题仍然存在,我们为什么要这样做?情节有点扭曲,现在当我们需要使用散列密码进行身份验证时,我们不会反转散列,而是对输入的密码进行散列,并将其与我们拥有的散列进行匹配。这为我们提供了一种将密码存储在某个地方的方法,使人类可读的密码文本无法复制(散列是ir可逆的)

    希望这能消除你的困惑


    Base64是一种加密方法,用于标准化存储的许多数字数据,并将文本更改为字节,保持简单。它是一个将存储的字符串转换为仅由64个不同字符(符号)及其组合组成的字符串的类。要了解有关base64的更多信息,谷歌哈希肯定主要用于验证文本的正确性

    例1: 您有一个哈希密码。有人给你一个密码。你想看看他给你的是不是正确的。所以你用同样的算法散列他的密码。如果您得到的哈希值与您拥有的哈希值相同,那么它就是正确的密码

    散列的优点:您没有保留实际密码,因此如果有人入侵您的数据库,他们就猜不到真正的密码

    例2: 您正在下载一个大文件。您希望确保通信中没有错误,并且没有人用可能包含恶意软件的其他文件替换该文件

    编写该文件的供应商会将该文件的哈希值与该文件分开提供给您

    下载文件后,对其运行相同的哈希算法。如果您得到的哈希值与供应商提供的相同,您就知道您下载了正确的文件,并且没有通信错误(很有可能)

    散列的优点:它几乎没有实际的冲突,因此文件中的一个小更改不太可能给您相同的散列

    例3: 您的公司将员工使用的所有文档和文件存储在磁盘上,并且不希望存储重复的文档和文件,因为这会浪费资源。因此,每当任何员工在公司文档目录中存储文件时,都需要检查该文件是否与现有文件重复

    对于目录中的每个文件,存储其哈希及其详细信息。当员工添加新文件时,您对该文件运行哈希算法。如果哈希值与任何现有哈希值匹配,则(很可能)是重复的。如果不是,它是一个新文件,可以存储

    散列的优点:它比文件小得多。您可以比较短哈希字符串,而不是将整个文件与所有现有文件进行比较


    加密文本时使用base64的原因是加密算法对字节有效,而不是对文本有效

    您可以使用适当的字符编码(在本例中为
    UTF-8
    )将原始文本转换为字节。但在运行加密算法后,返回的字节不一定符合任何标准字符编码。可能存在表示控制字符等的字节,或者是无效的
    UTF-8

    因此,为了从中获得某种可读字符串,可以使用base64,它将加密的字节转换为文本,即使在只支持ASCII的旧环境中也可以使用

    要解密文本,首先必须使用base64算法将其转换回字节,然后才能对其进行解密,并使用
    UTF-8
    将解密后的字节转换回文本

    真实文本➞ [UTF-8]➞ 字节➞ [密码]➞ 加密字节➞ [BASE64]➞ 加密文本

    加密文本➞ [BASE64]➞ 加密字节➞ [解密]➞ 字节➞ [UTF-8]➞ 真实文本


    不要将此编码算法名称中的“64”与密码中使用的密钥和块的大小混淆。“64”只是表示字节被翻译成64个可能的字符(加上作为特殊填充符的
    =
    )。

    散列是存储密码的常用方法。如果你(正确地)对密码进行哈希运算,那么(理论上)就不可能知道密码原来是什么,所以窃取哈希运算(理论上)是毫无意义的。我可以稍后解密它吗?你为什么要问?在你自己的名言中:“无法逆转或破译”,这就是我感到困惑的原因。如果我加密了它,没有人能弄明白,但是如果以后即使我自己不能解密它,那又有什么意义呢?这就是加密的目的:散列=单向,不可逆。encryption=双向可逆。Base64编码不是一种加密方法对不起,我是说编码。我会改正的。谢谢