加密方法如何工作?

时间:2015-01-05 18:37:30

标签: java encryption cryptography

好吧,我正在读加密方法。我发现有3种类型。

  1. 散列加密
  2. 对称方法
  3. 不对称表格
  4. 我不了解加密加密和对称方法中的AES的某些部分。

    Hashing Encryption面临的问题:: 我读了 - " 一旦数据被加密,该过程就无法被反转或破译"。 比我的问题是,为什么有人会使用这种方法,如果你只能加密数据,但不能解密它?还是我弄错了?

    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"))));
        }
    }
    

2 个答案:

答案 0 :(得分:2)

哈希主要用于验证文本的正确性。

示例1:

您有一个哈希密码。一个人给你一个密码。你想检查他是否给了你正确的一个。所以你使用相同的算法哈希他的密码。如果您获得了相同的哈希值,那么它就是正确的密码。

散列优势:您没有保留实际密码,因此如果人们侵入您的数据库,他们无法猜出真实密码。

示例2:

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

编写该文件的供应商会为您提供该文件的哈希值,与文件分开。

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

哈希的好处:它几乎没有真实的冲突,因此文件中的小变化不太可能为您提供相同的哈希值。

示例3:

您的公司存储员工在磁盘上使用的所有文档和文件,并且不想存储重复项,因为它会浪费资源。因此,只要任何员工将文件存储在公司文档目录中,就需要检查它是否与现有文件不重复。

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

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


加密文本时使用base64的原因是加密算法适用于字节而不是文本。

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

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

要解密文本,首先必须使用base64算法将其转换回字节,然后您可以解密它,并使用UTF-8将解密的字节转换回文本。

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

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

不要混淆" 64"在此编码算法的名称中,使用您在密码中使用的键和块的大小。那" 64"简单地表示字节被转换为64个可能的字符(加=作为特殊填充符)。

答案 1 :(得分:1)

我没有查看您提供的代码,但会以最简单的方式回答您的问题。

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

希望这可以清除你的困惑

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