XTEA是否bitlocker能被破解吗解

拒绝访问 | www.th7.cn | 百度云加速
请打开cookies.
此网站 (www.th7.cn) 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(3e70-ua98).
重新安装浏览器,或使用别的浏览器他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)XXTEA 可逆加密解密算法 C++ C#兼容版本 - 推酷
XXTEA 可逆加密解密算法 C++ C#兼容版本
1.一个不错的可逆加密算法XXTEA
之前无意中看到了TexturePacker 使用了XXTEA来加密图片资源。所以花了点时间来看了下XXTEA。
一般有两种加密算法:1.像md5,SHA1,等hash算法,是不可逆的。一般数据库存的用户名和密码就用这个。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 2.本文所提到的XXTEA算法,是可逆的,有个key可以加密。
安全方面的东西还蛮多的,说到key,还有什么public key, private key,我都还给老师了。忘光了。
可逆加密算法的需求还是比较广的,像加密游戏存档(发现还是无法防止内存修改),加密日志,加密图片等。
可逆加密算法我的要求比较简单:
1.足够安全,2.速度快,3.跨语言
2.XXTEA代码
#include &stdint.h&
#define DELTA 0x9e3779b9
#define MX (((z&&5^y&&2) + (y&&3^z&&4)) ^ ((sum^y) + (key[(p&3)^e] ^ z)))
void btea(uint32_t *v, int n, uint32_t const key[4]) {
uint32_t y, z,
unsigned p, rounds,
if (n & 1) {
/* Coding Part */
rounds = 6 + 52/n;
z = v[n-1];
sum += DELTA;
e = (sum && 2) & 3;
for (p=0; p&n-1; p++) {
y = v[p+1];
z = v[p] += MX;
z = v[n-1] += MX;
} while (--rounds);
} else if (n & -1) {
/* Decoding Part */
rounds = 6 + 52/n;
sum = rounds*DELTA;
e = (sum && 2) & 3;
for (p=n-1; p&0; p--) {
z = v[p-1];
y = v[p] -= MX;
z = v[n-1];
y = v[0] -= MX;
} while ((sum -= DELTA) != 0);
这个是wiki上抄的代码,可以看出代码非常简短,加密和解密合起来都只有这么点。
对C语言还真是不熟悉,网上找了个C++和C#的代码,发现写的还不错。可以对任意字符串(包括中文),用字符串作为key加密。结果是经过base64变成了简单的字符串,这样可以比较方便处理。
int _tmain(int argc, _TCHAR* argv[])
string painText = &hello world 啊&;
char * temp =(char *) painText.c_str();
string key = &abcdef&;//秘钥
cout&& &pain text:&&&painText&&
string result = xxtea_encrypt(painText,key);//加密
cout&&&encrypt result:& &&result&&
string result_1 = xxtea_decrypt(result,key);//解密
cout&& &decrypt result:& &&result_1&&
system(&pause&);
尝试去找了下java版本,不知道为什么不兼容,以后再看。
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致利用TEA算法进行数据加密 - pengyingh - 博客园
http://blog.chukong-inc.com/index.php//利用tea算法进行数据加密/
TEA(Tiny Encryption Algorithm)是一种小型的对称加密解密算法,最初是由剑桥计算机实验室的 David Wheeler 和 Roger Needham 在 1994 年设计。采用128位密钥,以8字节(64位)对数据分块进行加密 / 解密。TEA特点是速度快、效率高,实现也非常简单。TEA出现后针对它的攻击也不断出现,在被发现存在缺陷后,TEA也发展出几个版本,分别是XTEA、Block TEA和XXTEA。XTEA 跟 TEA 使用了相同的简单运算,但它采用了截然不同的顺序,为了阻止密钥表攻击,四个子密钥(在加密过程中,原 128 位的密钥被拆分为 4 个 32 位的子密钥)采用了一种不太正规的方式进行混合,但速度更慢了。Block TEA 是XTEA算法的变种,它可以对 32 位大小任意倍数的变量块进行操作。该算法将 XTEA 轮循函数依次应用于块中的每个字,并且将它附加于它的邻字。该操作重复多少轮依赖于块的大小,但至少需要 6 轮。该方法的优势在于它无需操作模式(CBC,OFB,CFB 等),密钥可直接用于信息。对于长的信息它可能比 XTEA 更有效率。在 1998 年,Markku-Juhani Saarinen 给出了一个可有效攻击 Block TEA 算法的代码,但之后很快 David J. Wheeler 和 Roger M. Needham 就给出了 Block TEA 算法的修订版,这个算法被称为 XXTEA。XXTEA 使用跟 Block TEA 相似的结构,但在处理块中每个字时利用了相邻字。它利用一个更复杂的 MX 函数代替了 XTEA 轮循函数。XXTEA 算法很安全,而且非常快速,非常适合应用于 Web 及嵌入式系统开发中。&但名气不大,采用的人比较少。我们在开发 iOS 系统程序时,由于大量的设定数据都是采用明文格式进行保存,容易被人分析修改。如现在常见的 iOS 非越狱机器上的内购应用破解,游戏数值修改等等。所以我们考虑利用XXTEA来对这些明文数据进行加密,来提高安全性。英文&&上面提供了 XXTEA 的 C 语言实现,代码非常简单。
#define MX (z&&5^y&&2) + (y&&3^z&&4)^(sum^y) + (k[p&3^e]^z);
long btea(long* v, long n, long* k) {
unsigned long z=v[n-1], y=v[0], sum=0, e, DELTA=0x9e3779b9;
long p, q ;
if (n & 1) {
/* Coding Part */
q = 6 + 52/n;
while (q-- & 0) {
sum += DELTA;
e = (sum && 2) & 3;
for (p=0; p&n-1; p++) y = v[p+1], z = v[p] += MX;
z = v[n-1] += MX;
return 0 ;
} else if (n & -1) {
/* Decoding Part */
q = 6 + 52/n;
sum = q*DELTA ;
while (sum != 0) {
e = (sum && 2) & 3;
for (p=n-1; p&0; p--) z = v[p-1], y = v[p] -= MX;
z = v[n-1];
y = v[0] -= MX;
sum -= DELTA;
函数把输入的数据当成一个整型数组&long* v ,其长度为&long n,加密采用的密钥也由数组传入long* k。由于要求传入的数据必须是整型对齐的,而我们平时应用中的数据长度不定。而且加密解密都在一个函数内进行操作,以长度 n 的值为正或负来进行区分也容易忽略,所以对它进行一下封装。作成单独的加密和解密函数
size_t XXTEAEncode(const unsigned char * pInputBuffer,
unsigned char * pOutputBuffer,
size_t nLength,
const_uint_ptr pUserDefineKey)
size_t nResult = 0;
if (pInputBuffer && pOutputBuffer && nLength & 0)
nResult = nLength / XXTEA_ALIGNMENT_BYTES +
(nLength % XXTEA_ALIGNMENT_BYTES ? 1 : 0);
memset(pOutputBuffer, 0, nResult * XXTEA_ALIGNMENT_BYTES);
memcpy(pOutputBuffer, pInputBuffer, nLength);
btea((uint32_t *)pOutputBuffer, nResult * 2, (uint32_t *)pUserDefineKey);
nResult *= XXTEA_ALIGNMENT_BYTES;
return nResult;
bool XXTEADecode(const unsigned char * pInputBuffer,
unsigned char * pOutputBuffer,
size_t nLength,
const_uint_ptr pUserDefineKey)
if(nLength %
return false;
bool result = false;
if(pInputBuffer && pOutputBuffer && nLength & 0)
int nSize = (nLength / XXTEA_ALIGNMENT_BYTES) * 2;
memset(pOutputBuffer, 0, nLength);
memcpy(pOutputBuffer, pInputBuffer, nLength);
btea((uint32_t *)pOutputBuffer, -nSize, (uint32_t *)pUserDefineKey);
result = true;
return result;
XXTEAEncode为加密函数,XXTEADecode为解密函数,他们的输入参数相同,源数据指针pInputBuffer,输出缓冲区指针pOutputBuffer,源数据长度nLength,和密钥数组pUserDefineKey。这里输出缓冲区的指针需要由调用者预先分配好,但是究竟需要多少内存呢?解密函数比较容易解决,因为解密后的数据肯定不会超过源数据长度,但是加密的时候由于需要将数据设置为整型对齐,数据可能长于输入数据长度。我们模仿 Windows API 的做法,修改一下加密函数,在输入参数中如果输出缓冲区指针为空,返回需要的buffer长度:
size_t XXTEAEncode(const unsigned char * pInputBuffer,
unsigned char * pOutputBuffer,
size_t nLength,
const_uint_ptr pUserDefineKey)
size_t nResult = 0;
if (pInputBuffer && pOutputBuffer && nLength & 0)
nResult = nLength / XXTEA_ALIGNMENT_BYTES +
(nLength % XXTEA_ALIGNMENT_BYTES ? 1 : 0);
memset(pOutputBuffer, 0, nResult * XXTEA_ALIGNMENT_BYTES);
memcpy(pOutputBuffer, pInputBuffer, nLength);
btea((uint32_t *)pOutputBuffer, nResult * 2, (uint32_t *)pUserDefineKey);
nResult *= XXTEA_ALIGNMENT_BYTES;
else if(nLength & 0)
nResult = ((nLength / XXTEA_ALIGNMENT_BYTES) +
(nLength % XXTEA_ALIGNMENT_BYTES ? 1 : 0)) * XXTEA_ALIGNMENT_BYTES;
return nResult;
现在我们就可以通过加密函数来取得需要的 buffer 长度并且分配好内存,然后进行加密处理了。来测试一下。首先声明一个字符串 NSString stringTest = @&Hello XXTEA!&; &写下这个字符串之后又想到一个问题。iOS系统中的字符是采用UTF-16编码格式,也就是说所有的字符都是双字节,和平常 C 语言下的 ANSI 字符不同,虽然一样可以取得缓冲区指针进行加密,但是在iOS下我们需要处理的各种设定数据基本都是英文字符的文本,对于一个设置文件来说比ANSI字符多了一倍的空间,我们还是转换一下让英文字符恢复到8位编码。查资料可以发现iOS系统不支持ANSI格式的双字节字符编码,我们选用UTF-8来兼容单、双字节字符,同时节省空间。
NSString * testString = @"Hello XXTEA!";
int key[4] = {0x, 0x734a67fc, 0xe367a642, 0x};
int nSize = XXTEAEncode((const unsigned char *)[testString cStringUsingEncoding:NSUTF8StringEncoding], NULL, testString.length, key);
char * outBuffer = (char *)malloc(nSize);
XXTEAEncode((const unsigned char *)[testString cStringUsingEncoding:NSUTF8StringEncoding], (unsigned char *)outBuffer, ,nSize, key);
char *formatBuffer = (char *)malloc(128);
memset(formatBuffer, 0, 128);
HexToString((const char *)outBuffer, nSize, formatBuffer);
("%s\n\n", formatBuffer);
free(formatBuffer);
free(outBuffer);
运行上面的代码得到输出结果:2F49EF4E29A46AE17F7E 。我们再对这串字符进行下解密处理来验证是否可以还原。
char * testData = "2F49EF4E29A46AE17F7E";
char * hexData = (char *)malloc(strlen(testData));
char * decryptBuffer = (char *)malloc(strlen(testData));
memset(hexData, 0, strlen(testData));
memset(decryptBuffer, 0, strlen(testData));
int nSize = StringToHex((const char *)testData, hexData);
XXTEADecode((const unsigned char *)hexData, (unsigned char *)decryptBuffer, nSize, key);
NSString * decodeString = [NSString stringWithCString:decryptBuffer encoding:NSUTF8StringEncoding];
NSLog(@"%@", decodeString);
free(decryptBuffer);
free(hexData);
在Xcode的Debug窗口中看到输出信息:test[] Hello XXTEA! 。解密完成。现在我们可以用XXTEA来处理明文文件,不会再被轻易篡改。在线Xtea加密解密、Xtea在线加密解密、Xtea encryption and decryption--查错网
在线Xtea加密解密、Xtea在线加密解密、Xtea encryption and decryption
待加密、解密的文本:
Xtea加密、解密转换结果(base64了):

我要回帖

更多关于 微信被拉黑了破解教程 的文章

 

随机推荐