如何检查字符串是否加密?

时间:2014-02-12 15:22:16

标签: java encryption

我使用这种加密方法来加密和解密某个字符串: -

package encryption;

import java.security.Key;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class AES {

     private static final String ALGO = "AES";
    private static final byte[] keyValue = 
        new byte[] { 'T', 'h', 'e', 'B', 'e', 's', 't',
'S', 'e', 'c', 'r','e', 't', 'K', 'e', 'y' };

public static String encrypt(String Data) throws Exception {
        Key key = generateKey();
        Cipher c = Cipher.getInstance(ALGO);
        c.init(Cipher.ENCRYPT_MODE, key);
        byte[] encVal = c.doFinal(Data.getBytes());
        String encryptedValue = new BASE64Encoder().encode(encVal);
        return encryptedValue;
    }

    public static String decrypt(String encryptedData) throws Exception {
        Key key = generateKey();
        Cipher c = Cipher.getInstance(ALGO);
        c.init(Cipher.DECRYPT_MODE, key);
        byte[] decordedValue = new BASE64Decoder().decodeBuffer(encryptedData);
        byte[] decValue = c.doFinal(decordedValue);
        String decryptedValue = new String(decValue);
        return decryptedValue;
    }
    private static Key generateKey() throws Exception {
        Key key = new SecretKeySpec(keyValue, ALGO);
        return key;
}

}

工作正常。

问题是我如何才能知道要解密的字符串是否已加密?

我的意思是我可以将一个很长的“未加密”字符串传递给decrypt方法,它仍然有用。

任何建议。

6 个答案:

答案 0 :(得分:4)

您可以通过简单地尝试解密来确定是否使用特定密钥,算法,模式和填充方案对某些内容进行了加密。

如果您正在解密数据,您知道正在使用的填充方案,并且您可以在尝试解密时验证填充是否正确。如果您无法从原始邮件中可靠地删除填充,则表示您遇到问题!

CBC模式的一个好处是几乎所有广泛使用的包含对称密码(如AES)的加密库都支持的是每个块在其数据方面取决于前一个块。这意味着错误将传播,并且您更有可能无法解密未实际加密或以某种方式意外损坏的数据。

我认为,如果传入的数据是使用特定的密钥,算法,模式和填充方案加密的话,这可能是您的代码行测试的最佳选择。

修改

但是,如果您需要高度确定密钥是否正确,则需要在密文或明文末尾添加消息验证码(MAC)。

您可以像这样形成您的信息:

CIPHERTEXT = ENCRYPT(KEY_1, PADDING, MODE, PLAINTEXT)
MESSAGE = CIPHERTEXT || HMAC(KEY_2, CIPHERTEXT)

CIPHERTEXT被定义为在特定密钥,填充和操作模式下加密明文的结果

MESSAGE被定义为CIPHERTEXT HMAC结果二进制连接(||)的结果。

KEY_1是一个加密安全密钥,独立于另一个加密安全密钥KEY_2

您希望针对HMAC计算CIPHERTEXT的原因是因为您不希望必须实际执行解密来验证邮件是否合法。

您必须启动加密会话,然后通过该加密通道交换KEY_2,这意味着您已经增加了密钥管理开销和代码复杂性,但是您有1/1 ^ 256(至少)查看错误消息的概率通过HMAC检查。

验证HMAC的结果后,您可以确定该消息可能实际上是在KEY_1下加密的,假设自会话开始或消息的生命周期以来没有发生任何泄漏。 / p>

答案 1 :(得分:3)

没有确切的说法;你唯一能做的就是查看一个字符串,看看它是否看起来像是可以理解的东西(粗略地说,file会返回比“数据”更具体的东西)。除非你有一些特性可以用来识别“纯文本”(可能是所有的ASCII或$ LANGUAGE的所有Unicode代码点),否则密文和任意二进制数据之间没有固有的区别。

答案 2 :(得分:1)

这个问题没有完美的答案,因为没有100%确定的方法可以知道某些内容是否已加密。但是它应该随机分布在所有可能的base64字符串中,这意味着它应该看起来与明文不同。你能分辨出英语和base64加密字符串之间区别的一种方法是查看有多少空格。

此帖子中有92个空格,但字符空间不会出现在base64中。如果你正在处理明文英文以外的东西,它会变得更有趣。

答案 3 :(得分:1)

当然可以,假设字符串足够长。 Those guys are detecting encrypted keys in memory dumps。当然,没有100%的保证 - 简单的例子,你可以编码编码的字符串,因此你的输入看起来就像一把钥匙。

通常,加密,编码或散列字节序列看起来像随机序列。它们具有更高的熵,比特分布更均匀,您无法压缩它们等。

最佳尝试是分析比特的随机分布情况。对于BASE64,您只需分析6位等。

答案 4 :(得分:0)

您似乎正在使用对称加密/解密方案,双方可以使用相同的密钥加密和解密邮件,这对于他们来说只有

双方可以就正确性验证方法达成一致,例如CRC。

与必须保密的密钥不同,这种方法可以公开宣布。

只有密钥的所有者才能生成真实的加密字符串,解密后可以使用此方法进行验证。

发送到解密的任何其他字符串都将无法通过CRC测试。

BTW,认证方法通常是哈希算法,如SHA,HMAC等,由于其性质,CRC通常更容易受到选择密文攻击,其中恶意方生成随机字符串,希望其中一些将被检测为真品。

答案 5 :(得分:-1)

大多数加密文本都包含“�”