📄 pc1_inputstream.java
字号:
/* PORTED TO JAVA BY ROBERT NEILD November 1999 */
/* PC1 Cipher Algorithm ( Pukall Cipher 1 ) */
/* By Alexander PUKALL 1991 */
/* free code no restriction to use */
/* please include the name of the Author in the final software */
/* the Key is 128 bits */
/* Only the K zone change in the two routines */
/* You can create a single routine with the two parts in it */
import java.io.*;
public class PC1_InputStream extends FilterInputStream
{
char ax,bx,cx,dx,si,tmp,x1a2,res,i,inter,cfc,cfd,compte;
char x1a0[] = new char[8];
byte cle[] = new byte[17]; // Hold key
/**
* Creates a PC1_InputStream. Decodes an input stream of encoded data.
* @param in The input stream to decode.
* @param password 16 byte encryption key
*/
public PC1_InputStream (InputStream in, byte[] password) {
super(in);
System.arraycopy(password,0,cle,0,Math.min(16,password.length));
}
private void assemble()
{
x1a0[0]= (char) (( cle[0]*256 )+ cle[1]);
code();
inter=res;
x1a0[1]= (char) (x1a0[0] ^ ( (cle[2]*256) + cle[3] ));
code();
inter=(char) (inter^res);
x1a0[2]= (char) (x1a0[1] ^ ( (cle[4]*256) + cle[5] ));
code();
inter=(char) (inter^res);
x1a0[3]= (char) (x1a0[2] ^ ( (cle[6]*256) + cle[7] ));
code();
inter=(char) (inter^res);
x1a0[4]= (char) (x1a0[3] ^ ( (cle[8]*256) + cle[9] ));
code();
inter=(char) (inter^res);
x1a0[5]= (char) (x1a0[4] ^ ( (cle[10]*256) + cle[11] ));
code();
inter=(char) (inter^res);
x1a0[6]= (char) (x1a0[5] ^ ( (cle[12]*256) + cle[13] ));
code();
inter=(char) (inter^res);
x1a0[7]= (char) ( x1a0[6] ^ ( (cle[14]*256) + cle[15] ) );
code();
inter=(char) (inter^res);
i=0;
}
void code()
{
dx=(char) (x1a2+i);
ax=x1a0[i];
cx=0x015a;
bx=0x4e35;
tmp=ax;
ax=si;
si=tmp;
tmp=ax;
ax=dx;
dx=tmp;
if (ax!=0) {
ax=(char) (ax*bx);
}
tmp=ax;
ax=cx;
cx=tmp;
if (ax!=0) {
ax=(char) (ax*si);
cx=(char) (ax+cx);
}
tmp=ax;
ax=si;
si=tmp;
ax=(char) (ax*bx);
dx=(char) (cx+dx);
ax=(char) (ax+1);
x1a2=dx;
x1a0[i]=ax;
res=(char) (ax^dx);
i=(char) (i+1);
}
/**
* Returns a plain byte, which has been unencrypted from the underlying
* InputStream.
* @see java.io.FilterInputStream
*/
public int read() throws IOException {
int c = in.read();
if (c==-1) /* EOF */
return -1;
assemble();
cfc=(char) (inter>>8);
cfd=(char) (inter&255); /* cfc^cfd = random byte */
/* K ZONE !!!!!!!!!!!!! */
/* here the mix of c and cle[compte] is after the decryption of c */
c = c ^ (cfc^cfd);
for (compte=0;compte<=15;compte++)
{
/* we mix the plaintext byte with the key */
cle[compte]=(byte) (cle[compte]^ c);
}
return c; /* write the decrypted byte */
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -