BASE64
首先 base64 是一种编码方式,它的字符集由64个不同字符组成(A-Z、a-z、0-9和两个额外字符+/)
,因此每个Base64字符都占用6个比特(2^6 = 64)
Base64编码后的数据长度 = 4 * ceil(原始数据长度 / 3)
其中,ceil() 是向上取整的函数
。请注意,如果原始数据的长度恰好是3的倍数,则不会添加填充字符 “=”,而编码后的数据长度将与原始数据长度成正比,约为4/3倍。
AES
AES(Advanced Encryption Standard)是一种对称加密算法,它是目前广泛使用的加密标准之一。AES加密算法使用相同的密钥(称为对称密钥)进行加密和解密操作,因此必须确保密钥的安全性。AES支持多种加密模式,这些模式决定了如何处理数据块并进行加密。
以下是一些常见的AES加密模式:
ECB(Electronic Codebook)模式:
ECB是最简单的AES加密模式。它将明文分成大小相等的数据块,然后对每个数据块单独进行加密。但是,ECB模式存在一些问题,因为相同的明文块会被加密成相同的密文块,这导致了一些安全性问题,例如可能泄漏信息模式和无法抵抗攻击者的重新排序攻击。
- CBC(Cipher Block Chaining)模式:
CBC模式解决了ECB模式的一些问题。在CBC模式中,每个数据块在加密前会与前一个密文块进行异或运算,然后再进行加密。这样做使得每个数据块的加密都依赖于前一个数据块,增加了密码算法的随机性。加密时,需要一个初始向量(IV)来作为第一个数据块的前一个密文块。为了保证安全性,IV应该是随机的且每次加密时都不同。 - CFB(Cipher Feedback)模式:
CFB模式将AES作为一个自反馈的流密码来使用,允许单个字节的加密和解密。类似于CBC,它使用初始向量(IV)来启动过程,但之后每个数据块的密文将反馈回加密算法以产生新的密文。 - OFB(Output Feedback)模式:
- OFB模式将AES作为一个自反馈的流密码来使用,类似于CFB。OFB模式使用初始向量(IV)来启动过程,然后使用AES算法的输出作为流密码,而不是使用密文反馈。
- CTR(Counter)模式:
CTR模式将AES用作计数器模式的流密码。它使用一个初始向量(IV)和一个计数器值,然后将IV和计数器值组合起来,加密后得到密钥流,再将密钥流和明文数据进行异或运算得到密文。
AES 的密钥支持 128、192、256位。
所以对于密钥要进行 base64 加密的话,最大长度不能超过32 个字符,32 个字符刚好是 256 位,超过就会报错如下
如果尝试在 Java
中使用超过256位的AES密钥,通常会抛出java.security.InvalidKeyException异常。这是因为Java标准库中的AES实现对于密钥长度有一定的限制,不支持超过256位的密钥
。