xxtea加密算法

wenlin56 2012-05-11 02:24:09
xxtea是一个加解密算法,算法实现如下


#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;
y = v[0];
z = v[n-1] += MX;
}
return 0 ;
} else if (n < -1) { /* Decoding Part */
n = -n;
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;
}
return 0;
}
return 1;
}


其它详细介绍在这里:http://en.wikipedia.org/wiki/XXTEA
函数long btea(long* v, long n, long* k)
v 表示需要加解密的源数据,加解密的结果依然存在v变量里。
n 传入值大于1表示加密,小于-1表示解密
k 密钥

我写了个测试代码

void main() {
long n = 10;
int k[4] = {1,2,3,4};
char data[1024] = "" ;

// 控制台输入需要加密的串
printf( "Do Encrypt. Input Data: " ) ;
scanf( "%s", data) ;
printf( "Data:\n %s\n", data ) ;

btea(data, n, k); // n为10,表示加密 <1>

printf( "Encrypt Data:\n %s\n", data);

btea(data, -n, k); // n为-10,表示解密

printf( "Decrypt Data:\n %s\n", data);
}



运行没有问题。

但是实际应用时是将加密后的结果保存起来(即 "<1>" 位置的 data),在需要用到的时候,读取这个结果,再解密。
所以,需要将加密结果,转成16进制的字符存储。因为我的C基础不好,网上也没有解决方案,我尝试了很久没有彻底解决,希望论坛有C厉害的朋友帮忙下。顺便提高下C功底~~


顶贴也欢迎噢~~




...全文
681 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
wenlin56 2012-05-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

C/C++ code

void main() {
long n = 10;
long k[4] = {1,2,3,4};
char data[1024] = "" ;

int datalen = 0;
char szdata[2048];
int i = 0;

// 控制台输入需要加密的串
printf( "Do Encry……
[/Quote]

非常感谢您!
已经可以了,但是有个疑问就是加密后的结果大多数时候太长了:
xxtea加密后每次都至少是40个字节长,hex后至少是80个字节。
—— 例如我加密“111”,出来的结果也是80字节长度。

但是输入某些内容,
—— 如111111加密后的长度是16,asdef加密后长度是6

...

谢谢你帮忙看下噢
^_^
wenlin56 2012-05-16
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
xxtea是一个加解密算法,算法实现如下

C/C++ code

#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=0x9……
[/Quote]
非常感谢您!
已经可以了,但是有个疑问就是加密后的结果大多数时候太长了:
xxtea加密后每次都至少是40个字节长,hex后至少是80个字节。
—— 例如我加密“111”,出来的结果也是80字节长度。

但是输入某些内容,
—— 如111111加密后的长度是16,asdef加密后长度是6

...

谢谢你帮忙看下噢
^_^
www_adintr_com 2012-05-11
  • 打赏
  • 举报
回复

void main() {
long n = 10;
long k[4] = {1,2,3,4};
char data[1024] = "" ;

int datalen = 0;
char szdata[2048];
int i = 0;

// 控制台输入需要加密的串
printf( "Do Encrypt. Input Data: " ) ;
scanf( "%s", data) ;
printf( "Data:\n %s\n", data ) ;

btea((long*)data, n, k); // n为10,表示加密 <1>

printf( "Encrypt Data:\n %s\n", data);

// 转换成十六进制格式.
datalen = strlen(data);
for(i = 0; i < datalen; ++i)
sprintf(&szdata[2*i], "%02X", (unsigned char)data[i]);
szdata[2 * i] = 0;
printf("Hex data: %s\n", szdata);

//转换回来
datalen = strlen(szdata);
for(i = 0; i < datalen / 2; ++i)
sscanf(&data[i], "%02X", &szdata[2 * i]);
data[i] = 0;
printf("Bin data: \n %s\n", data);


btea((long*)data, -n, k); // n为-10,表示解密

printf( "Decrypt Data:\n %s\n", data);
}

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧