C++ 在OSX上实现微加密算法
我正在完成Stroustrup的“编程:使用C++的原则和实践”中的练习。在第25章中,他介绍了微型加密算法(TEA)。他和网站上的几篇文章都声称它没有被破坏,考虑到代码有多短,这似乎“太好了,不可能是真的!” 注:我必须将C++ 在OSX上实现微加密算法,c++,algorithm,encryption,C++,Algorithm,Encryption,我正在完成Stroustrup的“编程:使用C++的原则和实践”中的练习。在第25章中,他介绍了微型加密算法(TEA)。他和网站上的几篇文章都声称它没有被破坏,考虑到代码有多短,这似乎“太好了,不可能是真的!” 注:我必须将long变量更改为int变量,因为位移位设计为在sizeof(var)=4的系统上实现 OSX实现了8字节的long类型,因此如果不进行此更改,Stroustrup的代码将无法工作 有谁能推荐其他简单实现的改进,让TEA在OS X上运行得更高效和/或更安全 void enci
long
变量更改为int
变量,因为位移位设计为在sizeof(var)=4的系统上实现
OSX实现了8字节的long类型,因此如果不进行此更改,Stroustrup的代码将无法工作
有谁能推荐其他简单实现的改进,让TEA在OS X上运行得更高效和/或更安全
void encipher(
const unsigned int* const v,
unsigned int* const w,
const unsigned int* const k
)
{
unsigned int y = v[0];
unsigned int z = v[1];
unsigned int sum = 0;
unsigned int delta = 0x9E3779B9;
unsigned int n = 32;
while(n-- > 0) {
y += (z << 4 ^ z >> 5) + z ^ sum + k[sum & 3];
sum += delta;
z += (y << 4 ^ y >> 5) + y ^ sum + k[sum>>11 & 3];
}
w[0]=y;
w[1]=z;
}
无效加密(
常数无符号整数*常数v,
无符号整数*常数w,
常数无符号整数*常数k
)
{
无符号整数y=v[0];
无符号整数z=v[1];
无符号整数和=0;
无符号整数增量=0x9E3779B9;
无符号整数n=32;
而(n-->0){
y+=(z>5)+z^sum+k[sum&3];
总和+=增量;
z+=(y>5)+y^sum+k[sum>>11&3];
}
w[0]=y;
w[1]=z;
}
(快点,伙计,谷歌!)
茶有一些缺点。最值得注意的是,它存在等价密钥,每个密钥等价于其他三个密钥,这意味着有效密钥大小只有126位。因此,TEA作为加密哈希函数尤其糟糕。这一弱点导致了一种入侵微软Xbox游戏机的方法,该密码被用作散列函数。TEA也容易受到相关密钥攻击,该攻击需要在相关密钥对下选择2^23个明文,时间复杂度为2^32。由于这些缺点,设计了XTEA密码
它看起来并不容易损坏,但在被认为是安全的之前,对算法进行了大量的分析。如果您需要安全加密,没有什么理由不使用经过详细分析的加密方法。上列出的弱点是否为您提供了任何指示,根据您需要的安全参数(我们不知道),您是否应该使用它?如果要确保32位的值,请使用uint32\u t
(虽然不是由标准管理的,但我还没有看到在
中没有提供它的实现)@WhozCraig我正在使用TEA来了解它。目前还没有真正的应用程序域。此外,为了便于学习,您能否解释一下使用uint32\t的好处?感谢您的评论。@user3176017如果由stdint.h
(或cstdint
(对于C++)中的实现提供,则定义为容纳32位无符号整数类型所需的任何类型。该算法需要(32位无符号)并且您所做的更改在某种程度上隐藏了它,但仍然以依赖于实现的方式进行。Wiki上提供的实现使用了uint32\u t
,正是出于这个原因,我建议您使用它作为模板。@WhozCraig谢谢您……我现在就知道了。Soren,我用谷歌搜索了……并阅读了维基百科。我之所以添加这个问题,是因为与Stroustrup在其书中提供的代码相比,要使其在OSX上运行需要进行编辑。对不起,我可能读得太快了。Wikipedia XTEA的实现非常精确地描述了比特宽度的重要性,所以我不希望您在Mac OS上遇到任何问题。