求助:把C算法Tea加密改成C#算法。500分相谢!

geniusoft 2005-06-03 06:49:50
下面算法改成
private byte[] encrpt(byte[] inbytes])
{
//请在这儿实现下面c语言的转换功能。
}

/**********************************************************
TEA - Tiny Encryption Algorithm
Feistel cipher by David Wheeler & Roger M. Needham
(extended version)
**********************************************************/

#define ROUNDS 32
#define DELTA 0x9e3779b9 /* sqr(5)-1 * 2^31 */

#include "ctypes.h"

/**********************************************************
Input values: k[4] 128-bit key
v[2] 64-bit plaintext block
Output values: v[2] 64-bit ciphertext block
**********************************************************/

void tean(word32 *k, word32 *v, long N) {
word32 y=v[0], z=v[1];
word32 limit,sum=0;
if(N>0) { /* ENCRYPT */
limit=DELTA*N;
while(sum!=limit) {
y+=((z<<4)^(z>>5)) + (z^sum) + k[sum&3];
sum+=DELTA;
z+=((y<<4)^(y>>5)) + (y^sum) + k[(sum>>11)&3];
}
} else { /* DECRYPT */
sum=DELTA*(-N);
while(sum) {
z-=((y<<4)^(y>>5)) + (y^sum) + k[(sum>>11)&3];
sum-=DELTA;
y-=((z<<4)^(z>>5)) + (z^sum) + k[sum&3];
}
}
v[0]=y; v[1]=z;
}

void cl_enc_block(word32 *k, word32 *v) {
tean(k,v,ROUNDS);
}

void cl_dec_block(word32 *k, word32 *v) {
tean(k,v,-ROUNDS);
}
...全文
380 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
俞庆平 2005-07-13
  • 打赏
  • 举报
回复
内容太多,请参考:
http://www.cnblogs.com/begincsdn/archive/2005/07/13/191987.html
俞庆平 2005-07-13
  • 打赏
  • 举报
回复
为什么有那么多人喜欢自己写加密或解决算法??
最简单的加密就是base64啦。

RSA或DPAPI不好用吗?
给你一个DPAPI吧。
using System;
using System.Runtime.InteropServices;

namespace CNetware.Data.DPAPI
{
/// <summary>
/// DataProtector 是使用 DPAPI 来加密和解密数据的托管库。
/// Web 应用程序经常需要在应用程序配置文件中存储与安全性密切相关的数据,
/// 如数据库连接字符串和服务帐户凭据。出于安全性考虑,决不要以明文形式存
/// 储此类信息,而一定要在存储之前进行加密。本类是一个托管类库,它用于封装
/// 对数据保护 API (DPAPI) 的调用以使用基于计算机或用户的密钥存储来加密和
/// 解密数据。可随后从其他托管应用程序使用该库,如 ASP.NET Web 应用程序、Web
/// 服务以及企业服务应用程序。
/// DPAPI 是加密 API (Crypto API) 的一部分并且是在 crypt32.dll 中实现的。它
/// 包含两个方法:CryptProtectData 和 CryptUnprotectData,本类库中方法被引用
/// 成了私有方法,在类外不可访问。
/// DPAPI 特别有用,因为它能够消除使用密码的应用程序所带来的密钥管理问题。虽
/// 然加密能确保数据安全,但您必须采取额外的步骤来确保密钥的安全。DPAPI 使用
/// 与 DPAPI 函数的调用代码关联的用户帐户的密码,以便派生加密密钥。因此,是
/// 操作系统(而非应用程序)管理着密钥。
///
/// DPAPI 能够与计算机存储或用户存储(需要一个已加载的用户配置文件)配合使用。
/// DPAPI 默认情况下用于用户存储,但您可以通过将 CRYPTPROTECT_LOCAL_MACHINE
/// 标志传递给 DPAPI 函数来指定使用计算机存储。
///
/// 这种用户配置文件方式提供了一个额外的安全层,因为它限制了哪些用户能访问机
/// 密内容。只有加密该数据的用户才能解密该数据。但是,当通过 ASP.NET Web 应用
/// 程序使用 DPAPI 时,使用用户配置文件需要您执行额外的开发工作,因为您需要采
/// 取明确的步骤来加载和卸载用户配置文件(ASP.NET 不会自动加载用户配置文件)。
///
/// 计算机存储方式更容易开发,因为它不需要管理用户配置文件。但是,除非使用一个
/// 附加的熵参数,否则并不安全,因为该计算机的任何用户都可以解密数据。(熵是一
/// 个设计用来使解密机密内容更为困难的随机值)。使用附加的熵参数出现的问题在于
/// 它必须由应用程序安全地存储起来,这带来了另一个密钥管理问题。
///
/// 注意:如果您将 DPAPI 和计算机存储一起使用,那么加密字符串仅适用于给定的计
/// 算机,因此您必须在每台计算机上生成加密数据。不要在场或群集中将加密数据从一
/// 台计算机复制到另一台计算机。如果将 DPAPI 和用户存储一起使用,则可以用一个漫
/// 游的用户配置文件在任何一台计算机上解密数据。
/// </summary>
俞庆平 2005-07-13
  • 打赏
  • 举报
回复
private unsafe void tean(int* k, int* v, int modopt(IsLongModifier) N)
{
int num3 = v[0];
int num2 = v[1];
int num1 = 0;
if (N > 0)
{
int num4 = N * -1640531527;
while (true)
{
if (num1 == num4)
{
break;
}
num3 += ((((num2 << 4) ^ (num2 >> 5)) + (num2 ^ num1)) + k[num1 & 3]);
num1 += -1640531527;
num2 += ((((num3 << 4) ^ (num3 >> 5)) + (num3 ^ num1)) + k[(num1 >> 11) & 3]);
}
}
else
{
num1 = -N * -1640531527;
while (true)
{
if (num1 == 0)
{
break;
}
num2 -= ((((num3 << 4) ^ (num3 >> 5)) + (num3 ^ num1)) + k[(num1 >> 11) & 3]);
num1 -= -1640531527;
num3 -= ((((num2 << 4) ^ (num2 >> 5)) + (num2 ^ num1)) + k[num1 & 3]);
}
}
v[0] = num3;
v[1] = num2;
}
rabbitonly 2005-07-13
  • 打赏
  • 举报
回复
关注啊,期待ing
geniusoft 2005-06-03
  • 打赏
  • 举报
回复
hi,没人能做吗?

110,568

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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