我需要加密单个 AES 块。我不能使用任何模式,如 CBC 和其他。我所看到的每个示例都使用流模式。
编辑:好的,我用下一种方式做了,但我真的不喜欢这种尝试。
void dec(const byte *key, const byte* xblock, const byte *cipher, byte *plain) {
AESDecryption d;
try {
const NameValuePairs &nvp = MakeParameters("", 0);
d.UncheckedSetKey(key, 16, nvp);
d.ProcessAndXorBlock(cipher, xblock, plain);
}
catch(...) {}
}
Run Code Online (Sandbox Code Playgroud) 我有一种情况,我必须存储密码,因为我正在构建一个系统来连接到另一个系统.此其他系统仅允许单个用户帐户,并且连接到它的唯一方法是通过密码.哈希在这里不合适.我必须以可以检索密码的方式存储密码.
现在,知道这不是一个完美的系统,我试图限制损害,如果有人以某种方式访问数据库.由于这个数据库需要被不同的平台使用,我决定使用MySQL自己的内置加密功能.这样,我不必担心为各种语言和系统找到兼容的加密/解密算法实现.我可以在查询中使用MySQL的函数.
存储密码时,我会使用AES_ENCRYPT("password", "encryption key").然后我意识到我应该使用一些盐,这样如果他们能够获得一个密码,那么获取其他密码就更难了.可是等等!有什么意义?如果他们能够获得一个密码,他们必须有加密密钥,是吗?
此外,这是一个分组密码.在某些情况下,盐可能几乎无用.
/* Returns 8CBAB2A9260975FF965E5A7B02E213628CBAB2A9260975FF965E5A7B02E21362FBB5D173CBAFA44DC406B69D05A2072C */
SELECT HEX(AES_ENCRYPT("passwordpasswordpasswordpassword", "encryption key"));
/* Returns 8CBAB2A9260975FF965E5A7B02E213628CBAB2A9260975FF965E5A7B02E21362C49AF8D5B194770E64FEF88767206391 */
SELECT HEX(AES_ENCRYPT("passwordpasswordpasswordpassworda", "encryption key"));
Run Code Online (Sandbox Code Playgroud)
我认为在使用像我这样的情况下使用对称加密时没有理由可以使用盐吗?
鉴于我必须以允许我检索原始值的方式存储密码,我还应该考虑其他任何方法吗?(我知道我需要注意加密密钥的存储位置和方式,并且我需要保护我的MySQL日志.)
I'm using CBC mode. I'm thinking of sending the IV encrypted in ECB mode(since it is only a block), instead of sending the "plain" IV. Will i gain some security?
好吧,在你们训斥我之前:我知道这是一个可怕的代码和超级微弱的密码.我只是试图找出以下是否有资格成为分组密码(即使是非常简陋和弱的密码)
int main(){
int mac = 123;
int key = 789;
int enc = mac^key;
printf("encrypted text = %d\n",enc);
int plain = enc^key;
printf("decrypted text = %d\n",plain);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是输出:
encrypted text = 878
decrypted text = 123
Run Code Online (Sandbox Code Playgroud) block-cipher ×4
cryptography ×3
aes ×1
c ×1
c++ ×1
crypto++ ×1
encryption ×1
mysql ×1
security ×1