寻加密算法

mostcat 2003-08-23 09:16:16
1 双向可逆,加密解密
2 有java源码,基于applet,不用jce
3 加密后秘文字符集可指定,比如只用所有字母小写生成秘文
4 支持中文
5 转换后密文不能比原文长很多

谢谢
...全文
166 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
ll42002 2003-08-26
  • 打赏
  • 举报
回复
/** 解密子密钥计算
* @param No param
* @return No return value
*/
void Creat_decrypt_sub_k()
{
//本函数的目的是生成解密子密钥
Z_1[1]=inv(Z[49]);
Z_1[2]=(char)(0-Z[50]);
Z_1[3]=(char)(0-Z[51]);
Z_1[4]=inv(Z[52]);
Z_1[5]=(char)(Z[47]);
Z_1[6]=Z[48];

for (int i=1;i<=7;i++){
Z_1[1+i*6]=inv(Z[49-i*6]);
Z_1[2+i*6]=(char)(0-Z[51-i*6]);
Z_1[3+i*6]=(char)(0-Z[50-i*6]);
Z_1[4+i*6]=inv(Z[52-i*6]);
Z_1[5+i*6]=Z[47-i*6];
Z_1[6+i*6]=Z[48-i*6];
}
Z_1[49]=inv(Z[1]);
Z_1[50]=(char)(0-Z[2]);
Z_1[51]=(char)(0-Z[3]);
Z_1[52]=inv(Z[4]);
}

/** 设置源数据
* @param input_m_string input the source data to be processed
* @return No return value
*/
void Set_m(byte[] input_m_string)
{
//本函数的目的是设置源数据
for (int i=0;i<=7;i++) m_string[i]=input_m_string[i];
}

/** 加密运算
* @param No param
* @return No return value
*/
void Encrypt()
{
//本函数的目的是加密

//把m分成X1,X2,X3,X4
Separate_m_2_X();

//下面做8圈叠代
for (int num=0;num<=7;num++){
temp1=multiply(Z[1+num*6],X1);//1
temp2=(char)(X2+Z[2+num*6]);//2
temp3=(char)(X3+Z[3+num*6]);//3
temp4=multiply(Z[4+num*6],X4);//4
temp5=(char)(temp1 ^ temp3);//5
temp6=(char)(temp2 ^ temp4);//6
temp7=multiply(Z[5+num*6],temp5);//7
temp8=(char)(temp7+temp6);
temp10=multiply(Z[6+num*6],temp8);
temp9=(char)(temp7+temp10);

X1=(char)(temp1 ^ temp10);
if (num!=7){
X2=(char)(temp3 ^ temp10);
X3=(char)(temp2 ^ temp9);
}
else{
X2=(char)(temp2 ^ temp9);
X3=(char)(temp3 ^ temp10);
}
X4=(char)(temp4 ^ temp9);
}//end of 8 times

//输出变换
X1=multiply(Z[49],X1);
X2+=Z[50];
X3+=Z[51];
X4=multiply(Z[52],X4);

//把X1,X2,X3,X4复制到c_string中。
//now,creat c_string from X1..X4;
c_string[1]=(byte)X1; c_string[0]=(byte)(X1>>8);
c_string[3]=(byte)X2; c_string[2]=(byte)(X2>>8);
c_string[5]=(byte)X3; c_string[4]=(byte)(X3>>8);
c_string[7]=(byte)X4; c_string[6]=(byte)(X4>>8);

//end of encryption
}

/** 解密运算
* @param No param
* @return No return value
*/
void Decrypt()
{//本函数的目的是解密

//把m分成X1,X2,X3,X4
Separate_m_2_X();

//下面做8圈叠代
for (int num=0;num<=7;num++){
temp1=multiply(Z_1[1+num*6],X1);//1
temp2=(char)(X2+Z_1[2+num*6]);//2
temp3=(char)(X3+Z_1[3+num*6]);//3
temp4=multiply(Z_1[4+num*6],X4);//4
temp5=(char)(temp1 ^ temp3);//5
temp6=(char)(temp2 ^ temp4);//6
temp7=multiply(Z_1[5+num*6],temp5);//7
temp8=(char)(temp7+temp6);
temp10=multiply(Z_1[6+num*6],temp8);
temp9=(char)(temp7+temp10);

X1=(char)(temp1 ^ temp10);
if (num!=7){
X2=(char)(temp3 ^ temp10);
X3=(char)(temp2 ^ temp9);
}
else{
X2=(char)(temp2 ^ temp9);
X3=(char)(temp3 ^ temp10);
}
X4=(char)(temp4 ^ temp9);
}//end of 8 times

//输出变换
X1=multiply(Z_1[49],X1);
X2+=Z_1[50];
X3+=Z_1[51];
X4=multiply(Z_1[52],X4);

//把X1,X2,X3,X4复制到c_string中。
//now,creat c_string from X1..X4;
c_string[1]=(byte)X1; c_string[0]=(byte)(X1>>8);
c_string[3]=(byte)X2; c_string[2]=(byte)(X2>>8);
c_string[5]=(byte)X3; c_string[4]=(byte)(X3>>8);
c_string[7]=(byte)X4; c_string[6]=(byte)(X4>>8);
//end of decryption
}

/** 结果输出
* @param output_c_string output the result
* @return No return value
*/
void Get_c(byte[] output_c_string)
{
//本函数的目的是获得目标数据
for (int i=0;i<=7;i++) output_c_string[i]=c_string[i];
}

}

/*test below*/
public class ideatest{
public static void main(String[] args){
int i;
myidea test=new myidea();
byte[] m={1,2,3,4,5,6,7,8};
byte[] k={9,8,7,6,5,4,3,2,1,0,1,2,3,4,5,6};
byte[] c=new byte[8];
test.Set_k(k);
test.Creat_encrypt_sub_k();
test.Creat_decrypt_sub_k();
System.out.println("密钥:");
for(i=0;i<=15;i++)
System.out.print(k[i]);
System.out.println("");

test.Set_m(m);
System.out.println("明文:");
for(i=0;i<=7;i++)
System.out.print(m[i]);
System.out.println("");

test.Encrypt();
test.Get_c(c);
System.out.println("密文:");
for(i=0;i<=7;i++)
System.out.print((int)(c[i])+" ");
System.out.println("");

test.Set_m(c);
test.Decrypt();
test.Get_c(c);
System.out.println("解密后明文:");
for(i=0;i<=7;i++)
System.out.print(c[i]);
System.out.println("");


System.out.println("hello!");
}
ll42002 2003-08-26
  • 打赏
  • 举报
回复
我这有IDEA算法:
import java.util.*;

/** IDEA encryption and decryption algorithm
* @author tekie
* usage:
* .Set_k,.Creat_encrypt_sub_k,[.Creat_decrypt_sub_k,]
* .Set_m,.Encrypt|.Decrypt,.Get_c,|{.Set_m,.Encrypt|.Decrypt,.Get_c}
*/
class myidea{

/* 源数据 */
private byte m_string[];
/* 目标数据 */
private byte c_string[];
/* 密钥 */
private byte k_string[];
/* 数据块 1, 2, 3, 4 */
private char X1,X2,X3,X4;
/* 加密子密钥 */
private char Z[];
/* 解密子密钥 */
private char Z_1[];
/* */
private char temp1,temp2,temp3,temp4,temp5;
private char temp6,temp7,temp8,temp9,temp10;

/* 初始化 */
myidea()
{
m_string=new byte[8];
c_string=new byte[8];
k_string=new byte[16];
Z=new char[53];
Z_1=new char[53];
}

/* */
private char inv(char x)
{
char t0, t1,q, y;
if (x <= 1)
return x; /* 0 and 1 are self-inverse */
t1 = (char)(0x10001 / x); /* Since x >= 2, this fits into 16 bits */
y = (char)(0x10001 % x);
if (y == 1)
return (char)(1-t1);
t0 = 1;
do
{ q = (char)(x / y);
x = (char)(x % y);
t0 +=(char)(q * t1);
if (x == 1)
return t0;
q = (char)(y / x);
y = (char)(y % x);
t1 +=(char)(q * t0);
} while (y != 1);
return (char)(1-t1);
}

/* */
private char multiply(char input1,char input2)
{
long p=input1*input2;
if (p == 0)
input2 = (char)(65537-input1-input2);
else {
input1 = (char)(p >> 16);
input2 = (char)p;
input1 = (char)(input2-input1);

if (input2 < input1) input1 += 65537;
}
return input1;
}

/* */
private void Separate_m_2_X()
{
//本函数的目的是从m string中得到X1,X2,X3,X4
//get X1,X2,X3,X4 from m string
char temp;

X1=(char)m_string[0];
X1<<=8;
temp=(char)m_string[1];
temp&=0xFF;
X1|=temp;

X2=(char)m_string[2];
X2<<=8;
temp=(char)m_string[3];
temp&=0xFF;
X2|=temp;

X3=(char)m_string[4];
X3<<=8;
temp=(char)m_string[5];
temp&=0xFF;
X3|=temp;

X4=(char)m_string[6];
X4<<=8;
temp=(char)m_string[7];
temp&=0xFF;
X4|=temp;
}

/** 设置密钥
* @param input_k_string input the 128bit key(16 byte)
* @return No return value
*/
void Set_k(byte[] input_k_string)
{
//本函数的目的是设置密钥
for (int i=0;i<=15;i++) k_string[i]=input_k_string[i];
}

/** 加密用子密钥运算
* @param No param
* @return No return value
*/
void Creat_encrypt_sub_k()
{
//本函数的目的是生成加密子密钥
//creat encrypt sub key and store to Z[57]
char temp;
byte temp1,temp2,temp3;
int i;
int num;
for (num=0;num <= 6;num++){
Z[1+num*8]=(char)k_string[0]; Z[1+num*8]<<=8;
temp=(char)k_string[1];temp=(char)(temp & 0x00FF);Z[1+num*8]|=temp;

Z[2+num*8]=(char)k_string[2];Z[2+num*8]<<=8;
temp=(char)k_string[3];temp=(char)(temp & 0x00FF);Z[2+num*8]|=temp;

Z[3+num*8]=(char)k_string[4];Z[3+num*8]<<=8;
temp=(char)k_string[5];temp=(char)(temp & 0x00FF);Z[3+num*8]|=temp;

Z[4+num*8]=(char)k_string[6];Z[4+num*8]<<=8;
temp=(char)k_string[7];temp=(char)(temp & 0x00FF);Z[4+num*8]|=temp;
if (num!=6) {
Z[5+num*8]=(char)k_string[8];Z[5+num*8]<<=8;
temp=(char)k_string[9];temp=(char)(temp & 0x00FF);
Z[5+num*8]|=temp;
}
if (num!=6){
Z[6+num*8]=(char)k_string[10];Z[6+num*8]<<=8;
temp=(char)k_string[11];temp=(char)(temp & 0x00FF);
Z[6+num*8]|=temp;
}
if (num!=6){
Z[7+num*8]=(char)k_string[12];Z[7+num*8]<<=8;
temp=(char)k_string[13];temp=(char)(temp & 0x00FF);
Z[7+num*8]|=temp;
}
if (num!=6){
Z[8+num*8]=(char)k_string[14];Z[8+num*8]<<=8;
temp=(char)k_string[15];temp=(char)(temp & 0x00FF);
Z[8+num*8]|=temp;
}

//now,start to left move 25 bit
//first left move 24 bit
temp1=k_string[0];
temp2=k_string[1];
temp3=k_string[2];
for (i=0;i<=12;i++) k_string[i]=k_string[i+3];
k_string[13]=temp1;k_string[14]=temp2;k_string[15]=temp3;

//then left move 1 bit,sum 25 bit
byte store_bit[]=new byte[16];//store k_string's first bit.
for (i=15;i >= 0;i--){
//from high bit to low
store_bit[i]=(byte)(k_string[i] >> 7);
store_bit[i]&=0x01;
k_string[i]<<=1;
if (i!=15) k_string[i]+=store_bit[i+1];
}
k_string[15]+=store_bit[0];
//complete to left move 25 bit
}//All encrypt sub key created
}
lilylamb 2003-08-25
  • 打赏
  • 举报
回复
不错
lilylamb 2003-08-25
  • 打赏
  • 举报
回复
不错
fpwang 2003-08-25
  • 打赏
  • 举报
回复
能不能把MD5的算法简要介绍一下呢
fpwang 2003-08-25
  • 打赏
  • 举报
回复
我正准备学MD5,没想到得到源代码
向scbb(星际Baby、captiveRobotCN(俘虏)致谢
我把我开发的BASE64开放出来,大家交流吧
BASE64很简单,是可逆的加密算法,我开发他是为用于SMTP认证。
/*
Base64 字符表
码值 字符 码值 字符 码值 字符 码值 字符
0 A 17 R 34 i 51 z
1 B 18 S 35 j 52 0
2 C 19 T 36 k 53 1
3 D 20 U 37 l 54 2
4 E 21 V 38 m 55 3
5 F 22 W 39 n 56 4
6 G 23 X 40 o 57 5
7 H 24 Y 41 p 58 6
8 I 25 Z 42 q 59 7
9 J 26 a 43 r 60 8
10 K 27 b 44 s 61 9
11 L 28 c 45 t 62 +
12 M 29 d 46 u 63 /
13 N 30 e 47 v
14 O 31 f 48 w (pad) =
15 P 32 g 49 x
16 Q 33 h 50 y
*/

public class Base64{
public static char BASETABLE[]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/','='};

public static String encode(String text){
/*编码算法
1.将数据按3个字节一组分成数块;
2.每块将3个8位的数据转换成4个6位数据段;
11111111 00000000 11111111 ---- 111111 110000 000011 111111
3.根据Base64字符表得到4个6位数据段对应的字符;
4.如果最后一块只有两个字节,则添加两个0位,转换成对应Base64字符表的三个字符,并在结尾添一个'='字符;
如果最后一块只有一个字节,则添加四个0位,转换成对应Base64字符表的两个字符,并在结尾添两个'='字符。
*/
StringBuffer code=new StringBuffer();
int textLength=text.length();
int blockCount=(int)textLength/3;
char[] textChars=new char[textLength];
int ch, bits;
text.getChars(0, textLength, textChars, 0);

for(int i=0;i<blockCount;i++){
ch=(int)textChars[0+i*3];
ch=ch>>>2;
code.append(BASETABLE[ch]);
bits=(int)textChars[0+i*3]-ch*4;
ch=(int)textChars[1+i*3];
ch=ch>>>4;
code.append(BASETABLE[ch+bits*16]);
bits=(int)textChars[1+i*3]-ch*16;
ch=(int)textChars[2+i*3];
ch=ch>>>6;
code.append(BASETABLE[ch+bits*4]);
bits=(int)textChars[2+i*3]-ch*64;
code.append(BASETABLE[bits]);
}
if((textLength % 3)!=0)
{ ch=(int)textChars[blockCount*3];
ch=ch>>>2;
code.append(BASETABLE[ch]);
bits=(int)textChars[blockCount*3]-ch*4;
switch(textLength % 3){
case 1: code.append(BASETABLE[bits*16]);
code.append(BASETABLE[64]);
code.append(BASETABLE[64]);
break;
case 2: ch=(int)textChars[1+blockCount*3];
ch=ch>>>4;
code.append(BASETABLE[ch+bits*16]);
bits=(int)textChars[1+blockCount*3]-ch*16;
code.append(BASETABLE[bits*4]);
code.append(BASETABLE[64]);
break;
}
}

return code.toString();
}

public static String decode(String code){
/*解码算法
1.将数据按4个字节一组分成数块;
2.每块将4个字符去掉最高两位并转换成3个8位的数据段;
注意:数据块中的字符取值不是ASCII集的值,而是Base64字符表中相对应的索引值!
00 111111 00 110000 00 000011 00 111111 ---- 11111111 00000000 11111111
3.根据ASCII字符集得到3个8位数据段对应的字符;
4.如果最后一块只有两个'=',去掉两个'=',并去掉最低两位,转换成对应ASSCII字符集的两个字符;
如果最后一块只有一个'=',去掉'=',并去掉最低四位,转换成对应ASSCII字符集的一个字符。
*/
StringBuffer text=new StringBuffer();
int codeLength=code.length();
int blockCount=(int)codeLength/4;
char[] codeChars=new char[codeLength];
int ch, bits;
code.getChars(0, codeLength, codeChars, 0);

for(int i=0;i<blockCount;i++){
bits=indexOfBase64Table(codeChars[1+i*4])>>>4;
ch=indexOfBase64Table(codeChars[0+i*4])*4+bits;
text.append((char)ch);
if(codeChars[2+i*4]!='='){
ch=(indexOfBase64Table(codeChars[1+i*4])-bits*16)*16;
bits=indexOfBase64Table(codeChars[2+i*4])>>>2;
ch=ch+bits;
text.append((char)ch);
if(codeChars[3+i*4]!='='){
ch=(indexOfBase64Table(codeChars[2+i*4])-bits*4)*64+indexOfBase64Table(codeChars[3+i*4]);
text.append((char)ch);
}
}
}

return text.toString();
}

private static int indexOfBase64Table(char ch){
for(int i=0;i<64;i++) if(ch==BASETABLE[i]) return i;
return -1;
}
}
captiveRobotCN 2003-08-24
  • 打赏
  • 举报
回复
public class MD5
{
/*
* A Java implementation of the RSA Data Security, Inc. MD5 Message
* Digest Algorithm, as defined in RFC 1321.
* Based on the javascript implementation of Paul Johnston
* Copyright (C) Paul Johnston 1999 - 2000.
* See http://pajhome.org.uk/site/legal.html for details.
* Java Version by Thomas Weber (Orange Interactive GmbH)
*/
/*
* Convert a 32-bit number to a hex string with ls-byte first
*/
String hex_chr = "0123456789abcdef";
private String rhex(int num)
{
String str = "";
for(int j = 0; j <= 3; j++)
str = str + hex_chr.charAt((num >> (j * 8 + 4)) & 0x0F) + hex_chr.charAt((num >> (j * 8)) & 0x0F);
return str;
}

/*
* Convert a string to a sequence of 16-word blocks, stored as an array.
* Append padding bits and the length, as described in the MD5 standard.
*/
private int[] str2blks_MD5(String str)
{
int nblk = ((str.length() + >> 6) + 1;
int[] blks = new int[nblk * 16];
int i = 0;
for(i = 0; i < nblk * 16; i++) {
blks[i] = 0;
}
for(i = 0; i < str.length(); i++) {
blks[i >> 2] |= str.charAt(i) << ((i % 4) * 8);
}
blks[i >> 2] |= 0x80 << ((i % 4) * 8);
blks[nblk * 16 - 2] = str.length()*8;

return blks;
}

/*
* Add integers, wrapping at 2^32
*/
private int add(int x, int y)
{
return ((x&0x7FFFFFFF) + (y&0x7FFFFFFF)) ^ (x&0x80000000) ^ (y&0x80000000);
}

/*
* Bitwise rotate a 32-bit number to the left
*/
private int rol(int num, int cnt)
{
return (num << cnt) | (num >>> (32 - cnt));
}

/*
* These functions implement the basic operation for each round of the
* algorithm.
*/
private int cmn(int q, int a, int b, int x, int s, int t)
{
return add(rol(add(add(a, q), add(x, t)), s), b);
}
private int ff(int a, int b, int c, int d, int x, int s, int t)
{
return cmn((b & c) | ((~b) & d), a, b, x, s, t);
}
private int gg(int a, int b, int c, int d, int x, int s, int t)
{
return cmn((b & d) | (c & (~d)), a, b, x, s, t);
}
private int hh(int a, int b, int c, int d, int x, int s, int t)
{
return cmn(b ^ c ^ d, a, b, x, s, t);
}
private int ii(int a, int b, int c, int d, int x, int s, int t)
{
return cmn(c ^ (b | (~d)), a, b, x, s, t);
}

/*
* Take a string and return the hex representation of its MD5.
*/
public String calcMD5(String str)
{
int[] x = str2blks_MD5(str);
int a = 0x67452301;
int b = 0xEFCDAB89;
int c = 0x98BADCFE;
int d = 0x10325476;

for(int i = 0; i < x.length; i += 16)
{
int olda = a;
int oldb = b;
int oldc = c;
int oldd = d;

a = ff(a, b, c, d, x[i+ 0], 7 , 0xD76AA478);
d = ff(d, a, b, c, x[i+ 1], 12, 0xE8C7B756);
c = ff(c, d, a, b, x[i+ 2], 17, 0x242070DB);
b = ff(b, c, d, a, x[i+ 3], 22, 0xC1BDCEEE);
a = ff(a, b, c, d, x[i+ 4], 7 , 0xF57C0FAF);
d = ff(d, a, b, c, x[i+ 5], 12, 0x4787C62A);
c = ff(c, d, a, b, x[i+ 6], 17, 0xA8304613);
b = ff(b, c, d, a, x[i+ 7], 22, 0xFD469501);
a = ff(a, b, c, d, x[i+ 8], 7 , 0x698098D8);
d = ff(d, a, b, c, x[i+ 9], 12, 0x8B44F7AF);
c = ff(c, d, a, b, x[i+10], 17, 0xFFFF5BB1);
b = ff(b, c, d, a, x[i+11], 22, 0x895CD7BE);
a = ff(a, b, c, d, x[i+12], 7 , 0x6B901122);
d = ff(d, a, b, c, x[i+13], 12, 0xFD987193);
c = ff(c, d, a, b, x[i+14], 17, 0xA679438E);
b = ff(b, c, d, a, x[i+15], 22, 0x49B40821);

a = gg(a, b, c, d, x[i+ 1], 5 , 0xF61E2562);
d = gg(d, a, b, c, x[i+ 6], 9 , 0xC040B340);
c = gg(c, d, a, b, x[i+11], 14, 0x265E5A51);
b = gg(b, c, d, a, x[i+ 0], 20, 0xE9B6C7AA);
a = gg(a, b, c, d, x[i+ 5], 5 , 0xD62F105D);
d = gg(d, a, b, c, x[i+10], 9 , 0x02441453);
c = gg(c, d, a, b, x[i+15], 14, 0xD8A1E681);
b = gg(b, c, d, a, x[i+ 4], 20, 0xE7D3FBC8);
a = gg(a, b, c, d, x[i+ 9], 5 , 0x21E1CDE6);
d = gg(d, a, b, c, x[i+14], 9 , 0xC33707D6);
c = gg(c, d, a, b, x[i+ 3], 14, 0xF4D50D87);
b = gg(b, c, d, a, x[i+ 8], 20, 0x455A14ED);
a = gg(a, b, c, d, x[i+13], 5 , 0xA9E3E905);
d = gg(d, a, b, c, x[i+ 2], 9 , 0xFCEFA3F8);
c = gg(c, d, a, b, x[i+ 7], 14, 0x676F02D9);
b = gg(b, c, d, a, x[i+12], 20, 0x8D2A4C8A);

a = hh(a, b, c, d, x[i+ 5], 4 , 0xFFFA3942);
d = hh(d, a, b, c, x[i+ 8], 11, 0x8771F681);
c = hh(c, d, a, b, x[i+11], 16, 0x6D9D6122);
b = hh(b, c, d, a, x[i+14], 23, 0xFDE5380C);
a = hh(a, b, c, d, x[i+ 1], 4 , 0xA4BEEA44);
d = hh(d, a, b, c, x[i+ 4], 11, 0x4BDECFA9);
c = hh(c, d, a, b, x[i+ 7], 16, 0xF6BB4B60);
b = hh(b, c, d, a, x[i+10], 23, 0xBEBFBC70);
a = hh(a, b, c, d, x[i+13], 4 , 0x289B7EC6);
d = hh(d, a, b, c, x[i+ 0], 11, 0xEAA127FA);
c = hh(c, d, a, b, x[i+ 3], 16, 0xD4EF3085);
b = hh(b, c, d, a, x[i+ 6], 23, 0x04881D05);
a = hh(a, b, c, d, x[i+ 9], 4 , 0xD9D4D039);
d = hh(d, a, b, c, x[i+12], 11, 0xE6DB99E5);
c = hh(c, d, a, b, x[i+15], 16, 0x1FA27CF8);
b = hh(b, c, d, a, x[i+ 2], 23, 0xC4AC5665);

a = ii(a, b, c, d, x[i+ 0], 6 , 0xF4292244);
d = ii(d, a, b, c, x[i+ 7], 10, 0x432AFF97);
c = ii(c, d, a, b, x[i+14], 15, 0xAB9423A7);
b = ii(b, c, d, a, x[i+ 5], 21, 0xFC93A039);
a = ii(a, b, c, d, x[i+12], 6 , 0x655B59C3);
d = ii(d, a, b, c, x[i+ 3], 10, 0x8F0CCC92);
c = ii(c, d, a, b, x[i+10], 15, 0xFFEFF47D);
b = ii(b, c, d, a, x[i+ 1], 21, 0x85845DD1);
a = ii(a, b, c, d, x[i+ 8], 6 , 0x6FA87E4F);
d = ii(d, a, b, c, x[i+15], 10, 0xFE2CE6E0);
c = ii(c, d, a, b, x[i+ 6], 15, 0xA3014314);
b = ii(b, c, d, a, x[i+13], 21, 0x4E0811A1);
a = ii(a, b, c, d, x[i+ 4], 6 , 0xF7537E82);
d = ii(d, a, b, c, x[i+11], 10, 0xBD3AF235);
c = ii(c, d, a, b, x[i+ 2], 15, 0x2AD7D2BB);
b = ii(b, c, d, a, x[i+ 9], 21, 0xEB86D391);

a = add(a, olda);
b = add(b, oldb);
c = add(c, oldc);
d = add(d, oldd);
}
return rhex(a) + rhex(b) + rhex(c) + rhex(d);
}

}

lynx1111 2003-08-24
  • 打赏
  • 举报
回复
md5不可逆!
scbb 2003-08-24
  • 打赏
  • 举报
回复
public class MD5 {
/**
* MD5 state
*/
MD5State state;

/**
* If Final() has been called, finals is set to the current finals
* state. Any Update() causes this to be set to null.
*/
MD5State finals;

/**
* Padding for Final()
*/
static byte padding[] = {
(byte) 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};

/**
* Initialize MD5 internal state (object can be reused just by
* calling Init() after every Final()
*/
public synchronized void Init () {
state = new MD5State();
finals = null;
}

/**
* Class constructor
*/
public MD5 () {
this.Init();
}

/**
* Initialize class, and update hash with ob.toString()
*
* @param ob Object, ob.toString() is used to update hash
* after initialization
*/
public MD5 (Object ob) {
this();
Update(ob.toString());
}

private int rotate_left (int x, int n) {
return (x << n) | (x >>> (32 - n));
}

/* I wonder how many loops and hoops you'll have to go through to
get unsigned add for longs in java */

private int uadd (int a, int b) {
long aa, bb;
aa = ((long) a) & 0xffffffffL;
bb = ((long) b) & 0xffffffffL;

aa += bb;

return (int) (aa & 0xffffffffL);
}

private int uadd (int a, int b, int c) {
return uadd(uadd(a, b), c);
}

private int uadd (int a, int b, int c, int d) {
return uadd(uadd(a, b, c), d);
}

private int FF (int a, int b, int c, int d, int x, int s, int ac) {
a = uadd(a, ((b & c) | (~b & d)), x, ac);
return uadd(rotate_left(a, s), b);
}

private int GG (int a, int b, int c, int d, int x, int s, int ac) {
a = uadd(a, ((b & d) | (c & ~d)), x, ac);
return uadd(rotate_left(a, s), b);
}

private int HH (int a, int b, int c, int d, int x, int s, int ac) {
a = uadd(a, (b ^ c ^ d), x, ac);
return uadd(rotate_left(a, s) , b);
}

private int II (int a, int b, int c, int d, int x, int s, int ac) {
a = uadd(a, (c ^ (b | ~d)), x, ac);
return uadd(rotate_left(a, s), b);
}

private int[] Decode (byte buffer[], int len, int shift) {
int out[];
int i, j;

out = new int[16];

for (i = j = 0; j < len; i++, j += 4) {
out[i] = ((int) (buffer[j + shift] & 0xff)) |
(((int) (buffer[j + 1 + shift] & 0xff)) << 8) |
(((int) (buffer[j + 2 + shift] & 0xff)) << 16) |
(((int) (buffer[j + 3 + shift] & 0xff)) << 24);

/* System.out.println("out[" + i + "] = \t" +
((int) buffer[j + 0 + shift] & 0xff) + "\t|\t" +
((int) buffer[j + 1 + shift] & 0xff) + "\t|\t" +
((int) buffer[j + 2 + shift] & 0xff) + "\t|\t" +
((int) buffer[j + 3 + shift] & 0xff));*/
}

return out;
}
scbb 2003-08-24
  • 打赏
  • 举报
回复

/**
* Class constructor
*/
public MD5 () {
this.Init();
}

/**
* Initialize class, and update hash with ob.toString()
*
* @param ob Object, ob.toString() is used to update hash
* after initialization
*/
public MD5 (Object ob) {
this();
Update(ob.toString());
}

private int rotate_left (int x, int n) {
return (x << n) | (x >>> (32 - n));
}

/* I wonder how many loops and hoops you'll have to go through to
get unsigned add for longs in java */

private int uadd (int a, int b) {
long aa, bb;
aa = ((long) a) & 0xffffffffL;
bb = ((long) b) & 0xffffffffL;

aa += bb;

return (int) (aa & 0xffffffffL);
}

private int uadd (int a, int b, int c) {
return uadd(uadd(a, b), c);
}

private int uadd (int a, int b, int c, int d) {
return uadd(uadd(a, b, c), d);
}

private int FF (int a, int b, int c, int d, int x, int s, int ac) {
a = uadd(a, ((b & c) | (~b & d)), x, ac);
return uadd(rotate_left(a, s), b);
}

private int GG (int a, int b, int c, int d, int x, int s, int ac) {
a = uadd(a, ((b & d) | (c & ~d)), x, ac);
return uadd(rotate_left(a, s), b);
}

private int HH (int a, int b, int c, int d, int x, int s, int ac) {
a = uadd(a, (b ^ c ^ d), x, ac);
return uadd(rotate_left(a, s) , b);
}

private int II (int a, int b, int c, int d, int x, int s, int ac) {
a = uadd(a, (c ^ (b | ~d)), x, ac);
return uadd(rotate_left(a, s), b);
}

private int[] Decode (byte buffer[], int len, int shift) {
int out[];
int i, j;

out = new int[16];

for (i = j = 0; j < len; i++, j += 4) {
out[i] = ((int) (buffer[j + shift] & 0xff)) |
(((int) (buffer[j + 1 + shift] & 0xff)) << 8) |
(((int) (buffer[j + 2 + shift] & 0xff)) << 16) |
(((int) (buffer[j + 3 + shift] & 0xff)) << 24);

/* System.out.println("out[" + i + "] = \t" +
((int) buffer[j + 0 + shift] & 0xff) + "\t|\t" +
((int) buffer[j + 1 + shift] & 0xff) + "\t|\t" +
((int) buffer[j + 2 + shift] & 0xff) + "\t|\t" +
((int) buffer[j + 3 + shift] & 0xff));*/
}

return out;
}

scbb 2003-08-24
  • 打赏
  • 举报
回复
/*
* $Header: /u/users20/santtu/src/java/MD5/RCS/MD5.java,v 1.5 1996/12/12 10:47:02 santtu Exp $
*
* MD5 in Java JDK Beta-2
* written Santeri Paavolainen, Helsinki Finland 1996
* (c) Santeri Paavolainen, Helsinki Finland 1996
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* See http://www.cs.hut.fi/~santtu/java/ for more information on this
* class.
*
* This is rather straight re-implementation of the reference implementation
* given in RFC1321 by RSA.
*
* Passes MD5 test suite as defined in RFC1321.
*
*
* This Java class has been derived from the RSA Data Security, Inc. MD5
* Message-Digest Algorithm and its reference implementation.
*
*
* $Log: MD5.java,v $
* Revision 1.5 1996/12/12 10:47:02 santtu
* Changed GPL to LGPL
*
* Revision 1.4 1996/12/12 10:30:02 santtu
* Some typos, State -> MD5State etc.
*
* Revision 1.3 1996/04/15 07:28:09 santtu
* Added GPL statemets, and RSA derivate stametemetsnnts.
*
* Revision 1.2 1996/03/04 08:05:48 santtu
* Added offsets to Update method
*
* Revision 1.1 1996/01/07 20:51:59 santtu
* Initial revision
*
*/

/**
* Contains internal state of the MD5 class
*/

class MD5State {
/**
* 128-byte state
*/
int state[];

/**
* 64-bit character count (could be true Java long?)
*/
int count[];

/**
* 64-byte buffer (512 bits) for storing to-be-hashed characters
*/
byte buffer[];

public MD5State() {
buffer = new byte[64];
count = new int[2];
state = new int[4];

state[0] = 0x67452301;
state[1] = 0xefcdab89;
state[2] = 0x98badcfe;
state[3] = 0x10325476;

count[0] = count[1] = 0;
}

/** Create this State as a copy of another state */
public MD5State (MD5State from) {
this();

int i;

for (i = 0; i < buffer.length; i++)
this.buffer[i] = from.buffer[i];

for (i = 0; i < state.length; i++)
this.state[i] = from.state[i];

for (i = 0; i < count.length; i++)
this.count[i] = from.count[i];
}
};

/**
* Implementation of RSA's MD5 hash generator
*
* @version $Revision: 1.5 $
* @author Santeri Paavolainen <sjpaavol@cc.helsinki.fi>
*/

public class MD5 {
/**
* MD5 state
*/
MD5State state;

/**
* If Final() has been called, finals is set to the current finals
* state. Any Update() causes this to be set to null.
*/
MD5State finals;

/**
* Padding for Final()
*/
static byte padding[] = {
(byte) 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};

/**
* Initialize MD5 internal state (object can be reused just by
* calling Init() after every Final()
*/
public synchronized void Init () {
state = new MD5State();
finals = null;
}
yuebenxian 2003-08-24
  • 打赏
  • 举报
回复
给你们网站...自己下载..记得加分.^_^
http://www.programsalon.com/download.asp?type_id=35
mostcat 2003-08-24
  • 打赏
  • 举报
回复
yuebenxian(我是谁) 大虾,网站我去过了,但那种算法符合我的需要阿?

另外 scbb(星际Baby) captiveRobotCN(俘虏) 两位很辛苦,但md5是不可逆的,不符合我的要求阿
mostcat 2003-08-24
  • 打赏
  • 举报
回复
yuebenxian(我是谁) 大虾,网站我去过了,但那种算法符合我的需要阿?

fpwang 2003-08-23
  • 打赏
  • 举报
回复
我也想要

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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