用java或者C/C++实现RC5算法
- 提问者网友:堕落的邪教徒
- 2021-12-31 10:34
请将程序发到我邮箱:[email protected]。
- 二级知识专家网友:糜废丧逼
- 2021-12-31 10:57
#define SHL1(x,s,w) ((RC5_WORd)((x)<<((w)-((s)&ROT_MASK))))
#define ROTR(x,s,w) ((RC5_WORd)(SHR1((x),(s))|SHL1((x),(s),(w))))
2、解密函数定义如下:
void RC5_Block_Decrypt (RC5_WORD *S,int R,char *in,char *out)
{
int i;
RC5_WORD A,B;
A = in[0] & 0xFF;
A += (in[1] & 0xFF) << 8;
A += (in[2] & 0xFF) << 16;
A += (in[3] & 0xFF) << 24;
B = in[4] & 0xFF;
B += (in[5] & 0xFF) << 8;
B += (in[6] & 0xFF) << 16;
B += (in[7] & 0xFF) << 24;
for(i=R;i>=1;i--){
B=ROTR((B-S[2*i+1]),A,W);
B=B^A;
A=ROTR((A-S[2*i]),B,W);
A=A^B;
}
B=B-S[1];
A=A-S[0];
out[0] = (A >> 0) & 0xFF;
out[1] = (A >> 8) & 0xFF;
out[2] = (A >> 16) & 0xFF;
out[3] = (A >> 24) & 0xFF;
out[4] = (B >> 0) & 0xFF;
out[5] = (B >> 8) & 0xFF;
out[6] = (B >> 16) & 0xFF;
out[7] = (B >> 24) & 0xFF;
return;
}
int RC5_CBC_Decrypt_Init (pAlg, pKey)
rc5CBCAlg *pAlg;
rc5UserKey *pKey;
{
if ((pAlg == ((rc5CBCAlg *) 0)) ||
(pKey == ((rc5UserKey *) 0)))
return (0);
RC5_Key_Expand (pKey->keyLength, pKey->keyBytes,pAlg->R, pAlg->S);
return (RC5_CBC_SetIV(pAlg, pAlg->I));
}
int RC5_CBC_Decrypt_Update(rc5CBCAlg *pAlg,int N,char *C,int *plainLen,char *P)
{
int plainIndex,cipherIndex,j;
plainIndex=cipherIndex=0;
for(j=0;j<BB;j++)
{
P[plainIndex]=pAlg->chainBlock[j];
plainIndex++;
}
plainIndex=0;
while(cipherIndex<N)
{
if(pAlg->inputBlockIndex<BB)
{
pAlg->inputBlock[pAlg->inputBlockIndex]=C[cipherIndex];
pAlg->inputBlockIndex++;
cipherIndex++;
}
if(pAlg->inputBlockIndex==BB)
{
pAlg->inputBlockIndex=0;
RC5_Block_Decrypt (pAlg->S,pAlg->R,pAlg->inputBlock,pAlg->chainBlock);
for(j=0;j<BB;j++)
{
if(plainIndex<BB)
P[plainIndex]^=pAlg->chainBlock[j];
else
P[plainIndex]=C[cipherIndex-16+j]^pAlg->chainBlock[j];
plainIndex++;
}
}
}
*plainLen=plainIndex;
return (1);
}
- 1楼网友:魅世女王
- 2021-12-31 12:39
- 2楼网友:劳资的心禁止访问
- 2021-12-31 12:19
md5是不可逆的加密算法,java实现如下
public class md5 {
static final int s11 = 7; static final int s12 = 12; static final int s13 = 17; static final int s14 = 22; static final int s21 = 5; static final int s22 = 9; static final int s23 = 14; static final int s24 = 20; static final int s31 = 4; static final int s32 = 11; static final int s33 = 16; static final int s34 = 23; static final int s41 = 6; static final int s42 = 10; static final int s43 = 15; static final int s44 = 21; static final byte[] padding = {-128, 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}; private long[] state = new long[4]; // state (abcd) private long[] count = new long[2]; // number of bits, modulo 2^64 (lsb first) private byte[] buffer = new byte[64]; // input buffer public string digesthexstr; private byte[] digest = new byte[16];