我使用这种加密方法来加密和解密某个字符串: -
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方法,它仍然有用。
任何建议。
答案 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)
大多数加密文本都包含“�”