C++ 在OSX上实现微加密算法

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

我正在完成Stroustrup的“编程:使用C++的原则和实践”中的练习。在第25章中,他介绍了微型加密算法(TEA)。他和网站上的几篇文章都声称它没有被破坏,考虑到代码有多短,这似乎“太好了,不可能是真的!”

注:我必须将
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上遇到任何问题。