【发布时间】:2021-09-16 05:47:48
【问题描述】:
我试图从头开始实现蛇加密算法作为个人项目,现在我被它的密钥调度部分所困扰。根据唯一的文档,https://www.cl.cam.ac.uk/~rja14/Papers/serpent.pdf,我需要将密钥填充为 256,以便开始生成子密钥。
如何在不依赖外部库的情况下应用填充。
这是我编写的代码,但我不能 100% 确定它会引导我实现我想要实现的目标
void prekeyexpasion(unsigned char * key,unsigned char * expandedkeys){
//padd the key to 256
int originalkeylen = strlen((const char*)key);
int lenOfPaddedkey = originalkeylen;
if(lenOfPaddedkey % 32 !=0){
lenOfPaddedkey = (lenOfPaddedkey / 32 + 1) * 32;
}
unsigned char * paddedkey = new unsigned char[lenOfPaddedkey];
for (int i = 0; i < lenOfPaddedkey; i++){
if ( i >= originalkeylen){
paddedkey[i] = 1;
}
else{
paddedkey[i] = key[i];
}
}
//expand to 33 128bit subkeys
//split per 128bit subkeys to 8 32 bit subsubkey
}
【问题讨论】:
-
填充键不是个好主意,拒绝小键输入或使用 PBKDF2 导出完整的键大小。
-
@kelalaka 不,这是关于在键上执行的内部填充。
-
@MaartenBodewes 我知道这一点。为什么我们要垫一个键?有人对填充密钥进行安全分析吗?
-
@kelalaka 我的意思是蛇论文中指定的内部。他们执行填充的原因在其中指定。 128 位密钥不应与 192 位密钥相同,因为最终的关键字设置为零而不是 1。如果您放大字节,这适用于除 256 位密钥之外的任何密钥大小。顺便说一句,我并不是为这个设计决定辩护,这就是它的定义方式。
标签: c++ cryptography padding