寻加密算法

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

谢谢
...全文
167 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
  • 打赏
  • 举报
回复
我也想要
移动神盾 PocketLock PPC加密工具. 使用技巧: 一、加密WM6.5短信和通话记录 01 设置新密码。本软件提供的双重密码保护机制,使短信和通话记录更加安全。第一次使用时,可按提示输入默认密码进入主界面后;点右下角的“密码设置”选 项,重新设置软件的登录密码和加密密码。注意,两者不要设为一样,完成后点“OK”返回。 02 为短信加密。在主界面进入“短信记录”,依次点击“选项”→“正常短信”来查看收件箱未加密的短信;在需加密的短信前打“√”,然后点“加密”。加密 后的短信不会出现在收件箱中,如要查看,需再次进“移动神盾”中,点“选项”→“隐藏”即可。 03 加密通话记录。在主界面点“通话记录”,如要对已拨号码加密,可点“选项”→“已拨电话”,勾选需加密的电话号码。加密后的号码不会显示在通话记录中 。按同样步骤可加密“未接电话”和“已接电话”。点“隐藏记录”可查看已加密过的通话记录。 04 隐藏联系人。如果你有一些VIP人士的电话号码不想被别人看到,可考虑把他们隐藏起来,方法为:在主界面点“电话簿”,依次点击“选项”→“正常”,此 时会弹出PPC手机中保存的联系人列表,然后勾选需要隐藏的联系人,并点击“加密”即可搞定。 05 用短信遥控防盗。如果手机真的被盗,也不要担心,一条短信就能销毁隐私。在主界面进“遥控防盗”,填好用于远程控制的电话号码和密码;当手机被盗时, 在控制端的手机上编写短信“+密码+8”发送给被盗手机,可删除被盗手机的所有联系人号码。 二、加密WM6.5文件和文件夹:用PocketLock工具 01 加密文件。启动PocketLock,点击“文件加密”,在浏览器中选择需加密的文件;然后点“确定”,再输入加密密码后确认即可。注意,密码最多可输入16位数 字;用PocketLock加密后,依然可在浏览器中看到该文件,而并非像“移动神盾”将其隐藏。 02 加密文件夹。与加密文件的方法类似,在浏览器中选好需加密的文件夹并确认。需要注意的是,加密文件夹实际是将文件夹内的所有文件进行加密,文件夹本身 并不会被加密。我们还可用加密文件夹的方法批量加密文件,适合多数量小文件的处理。 03 解密文件或文件夹。进入“文件解密”选项,找到已加密的文件并点击“确定”;然后在密码框中输入正确的密码进行确认后,即可解密。在解密文件夹时,解 密所需要的时间可根据文件夹内的文件多少来决定,文件越多,耗费时间越久。 04 设置加密算法。如果手机不幸被偷,可将在电脑上备份的加密文件,拷贝至另一部同系统的PPC中解密使用。可进“设置”,并点击“设置解密方法”,找到以 前所用的加密算法,就可在这台PPC上解密了。PocketLock提供了近三十种的加密算法。 05 关联程序。由于本版是绿色软件,需先将已加密文件与程序关联。这样以后每次查看已加密文件内容时,输入密码即可打开,方法为:在Resco Explorer中点住 加密文件,在弹出菜单打开方式”,浏览找到“PocketLock.exe”并点“完成”。
GMT 0009-2012 SM2 密码算法使用规范,详细描述SM2算法使用规范 GM/T0010-2012 目次 前言 1范围…… 2规范性引用文件…………… 3术语和定义 ·· 4符号和缩略语… 5OID定义… 6基入类型定义…………………… 6.1 Certilicate revocationlists 6.2 Content Encryption AlgorithmIdentifier………………………………………… 6.3 Digest algorithmldentifie 6.4 Digest Encryption algorithmIdentifier…………………… 6.5 Extended certificate OrCertificate 6,6 Extended certificatesAnd certificates……………………… 6,7 Issuer AndserialNumber……………… 6.8 KeyEncryptionAlgorithmldentilier 6,9 Version………………………………………………………………………………… 6.10 Contentinfo 7数据类型data 8签名数据类型 signedData…………… 8.1 signedData类型 8.2 SignerInfo类型…… 9数字信封数据类型 envelopeddata… 9.1 envelopedData类型 9,2 RecipientInfo类型……… 10签名及数字信封数据类型 signed And EnvelopedData……… 11加密数据类型 encryptedData 12密钥协商类型 key AgreementInfo 附录A(规范性附录)SM2密钥格式 A.1椭圆曲线参数语法… A.2公钥语法 A.3私钥语法 参考文献…………………………… GM/T0010-2012 前言 本标准按照GB/T1.12009的规则编写 请注意本文件的某些内容可能涉及专利。本文件的发布机构不承担识别这些专利的责任 本标准由国家密码管理局提出并归口 本标准中的附录A为规范性附录。 木标准起草单位:上海格尔软件股份有限公司、北京海泰方圆科技有限公司、北京数字认证股份有 限公司、无锡江南信息安全工程技术中心、成都卫士通信息产业股份有限公司、上海巾数字证书认证中 心有限公司、兴唐通信科技有限公司、上海颐东网络信息有限公司、山东得安信息技术有限公司、国家信 息安全工程技术研究中心。 本标准起草人:刘平、谭武征、柳増寿、李述胜、徐强、李元正、刘承、王妮娜、夏东山、蒋红宇、孔凡玉 袁峰。 本标准涉及的密码算法按照国家密码管理部门的要求使用 Ⅱ GM/T0010—2012 SM2密码算法加密签名消息语法规范 1范 本规范定义了使用SM2密码算法的加密签名消息语法。 本规范适用于使用SM2密码算法进行加密和签名操作时对操作结果的标准化封装。 2规范性引用文件 下列文件对于本文件的应用是必不可少的。凡是注日期的引用文件,仪注日期的版本适用于本文 件,凡是不注日期的引用文件,其最新版本(包括所有的修改单)适用于本文件。 GM/T0006密码应用标识规范 GM/ T AAAA SV2密码算法使用规范 PKCS #5 Extended-Certificate Syntax 3术语和定义 下列术语适用于本规范。 算法标识 algorithm identifier 用于标明算法机制的数字化信息 SM2算法SM2 algorithM 一种椭圆曲线密杩算法,密钥长度为256比特。 4符号和缩略语 下列缩略语适用于本规范 ECC 椭圆曲线密码算法( Elliptic Curve cryptography) 用户标识( Identity) OID 对象标识符( Object Identity) 5OID定义 本规范对6个对象data, signeddata, envelopedData, signedAnd Data, encryptedData和 key AgreementInfo的标识符进行了定义,详见表1 GM/T0010-2012 表1对象标识符 对象标识符OID 对象标识符定义 1.2,156.10197.6.1.4.2 SM2密码算法加密签名消息语法规范 1.2.156.10197.6.1.4.2.1 数据类型data 1.2.156.10197.6.1.4.2.2 签名数据类型 signedData 1.2,156,10197.6.1.4.2,3 数字信封数据类型 enveloped Data 签名及数字信封数据类型 1.2.156.1C197.6.1.4.2.4 signedAndEnvelopedData 1.2,156,10197.6.1.4.2.5 加密数据类型 encryptedData 1.2,156,10197.6.1.4.2,6 密钥协商类型 key AgreementInfo 6基本类型定义 6.1 Certificate Revocation lists Certificaterevocationlists类型标明一个证书撤销列表的集合。 Certificatereyocationlists;:= SET OF Certificaterevocation list 6. 2 ContentEncryptionAlgorithmldentificr Content Encryptionalgorithmldentifier类型标明一个数据加密算法。其OI见GM/T0006 Content Encryption AlgorithmIdentifier :: AlgorithmIdentifier 6.3 DigestAlgorithm ldentifier DigestAlgorithmIdentifier类型标明一个消息摘要算法,夲规范为SM3算法,其OID见GM/ T0006。 DigestAlgorithmIdentifier : AlgorithmIdentifier 6. 4 DigestEncryptionAlgorithmIdentifier Digest Encryption algorithmIdentifier类型标明一个签名算法,本规范为SM2密码算法,其OI见 GM/T OOO Digest EncryptionAlgorithmIdentifier AlgorithmIdentifier 6.5 ExtendedcertificateorCertificate ExtendedcertificateOrCertificate类型指定一个PKCS#6扩展证书或者一个X.509证书。这一类 型见PKCS=6第6节推荐的语法 ExtendedCertificate OrCertificate ::=CHOICE I certificate Certificate.--.509 extendedCertificate [o IMPLICIT Extended Certificate GM/T0010—2012 6.6 ExtendedCertificates And Certificates ExtendedcertificatesAndcertificates类型指定一个扩展证书和X.509证书的集合。它表示集合足 以包含从可识别的“根”或“顶级CA”到所有签名者的证书链。 ExtendedcertificatesandCertificates : SET OF Extendedcertificate orcertificate 6. Issuer AndSeriaINumber Issuer And SerialNumber类型标明一个证书颁发者可识别名和颁发者确定的证书序列号,可据此 确定一份证书和与此证书对应的实体及公钥。 IssuerAndSerialNumber SEQUENCE issuer name serialNumber certificate SerialNumber 6.8 Kcy EncryptionAlgorithmldentificr KeyEncryptionAlgorithmIdentifier类型标明加密对称密钥的加密算法。 Key encryptionalgorith mldentilier :: Algorithmlden 6.9ⅴ ersion Version类型标明语法版本号。 Version :: INTEGER(1 6. 10 ContentInfo ContentInfo类型标眀内容交换通用语法结构,内容交换的通用语法结构定义如下」 ContentInfo :: SEQUENCE contentType Content type contentO] EXPLICIT ANY DEFINED BY content Type OPTIONAL ContentType OBJECT IDEN TⅠFIER 其中 ContentType内容类型是一个对象标识符,其定义见本规范第5章。 content内容,可选。 7数据类型data data数据类型结构定义如下: Data .. OCTET STRING Data数据类型表示任意的字节串,比如ASCI文本文件。 GM/T0010—2012 8签名数据类型 signed Data 8.1 signed Data类型 signeddata数据类型由任意类型的数据和至少一个签名者的签名值组成。任意类型的数据能够同 时被任意数量的签名者签名。 signeddata数据类型结构定义如下 SignedData ::= SEQUENCE versionⅤ ersion, digest algorithms digest algorithmIc entities. contentInfo sm2signature certificates o IMPLICIT ExtendedCertificates And Certificates OPTIONAL crls[ 1] IMPLICIT Certificate Revocation Lists OPTIONAI Signerinlos Signerinlos Digestalgorithm Identifiers : SET OF Digest AlgorithmIdentifier SignerInfos::= SET OF SignerInfo 结构中各项含义见表2 表2 signedData数据类型 字段名称 数据类型 含义 version (1) V ersion 语法的版木号 digestAlgorithms DigestAlgorithmIdentifiers 消息摘要算法标识符的集合 contention SM2Signaturc 被名的数据内谷,数据类型见GM/ T AAAA ExtendedCertificatesAndcertif certifica PKCS#6扩展证书和X.509证书的集合 Icates CrIs Certificate Revocation lists 证书撤销列表的集合 signIngs SignerInfos 每个签名者信息的集合 8.2 Signerlnfo类型 gnerInfo类型结构定义如下: SignerInfo :: SEQUENCE version version issuer And SerialNumber IssuerAndSerial Number digest Algorithm DigestAlgorithmldentifier authenticated AttributesLO] IMPLICIT Attributes OPTIONAL digest Encryption Algorithm Digest EncryptionAlgorithmIdentifier

62,614

社区成员

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

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