如何工作java密码aes-cbc

问题描述:

我使用密码AES-cbc。我有一个thrid部分字符串加密和一个关键。如何工作java密码aes-cbc

我想请教一些问题,

当我解密,我得到了异常

javax.crypto.BadPaddingException: Given final block not properly padded 
    at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..) 
    at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..) 
    at com.sun.crypto.provider.AESCipher.engineDoFinal(DashoA13*..) 

我在论坛上阅读,这可能是因为加密密钥和解密密钥是型动物。这可能发生在我的问题?

另外我如何与cbc合作我需要一个iv向量。但我不知道iv矢量加密。我需要这个矢量吗?我怎样才能得到我?

+0

考虑接受有用的答案。 要接受答案,请点击最佳答案旁边的空白复选标记,这样做会增加您的声望并提供更多功能,请参阅[声誉常见问题](http://stackoverflow.com/faq#reputation)请参阅[本页](http://meta.stackoverflow.com/questions/5234/how-does-accepting-an-answer-work)了解更多详情。 另外请考虑回去并接受过去的答案,这样做会增加你的声望,并允许更多的功能,请参阅[声誉常见问题](http://stackoverflow.com/faq#reputation) – zaph

CBC代表密码块链接,这意味着加密一个数据块的输出与下一个输入块异或。对于第一个块,随机数据块(称为IV)与输入异或。 IV应该是随机数据,并在执行加密时生成。你肯定需要IV,并且无法恢复它。你只能从产生它的人那里得到它。没有正确的IV几乎肯定是你的填充异常的原因。

+1

IV只是一个原因如果消息只有一个单独的块,则为异常。错误的IV仅影响第一块。 –

+0

啊真的。我正在考虑加密,但解密你当然是对的。 – Kosh

填充错误通常意味着解密失败,但不能依赖于确定正确的解密,并且如果向调用者报告可以创建可用于在没有密钥的情况下恢复原始文本的填充oracle。这可能是因为用于加密和解密的填充方法,模式,密钥或iv不相同。

最好是,如果密钥和iv完全符合要求,则iv的长度与AES的16字节块相同。密钥可以是128位(16字节),192位(24字节)或256位(32字节)。

对于CBC模式,需要一个iv,最好的做法是生成一个随机iv并将其加入到加密数据中,以使解密具有相同的iv可用性。 iv不需要保密。