📄 pc1_outputstream.java
字号:
/* JAVA Port 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_OutputStream extends FilterOutputStream
{
char ax,bx,cx,dx,si,tmp,x1a2,res,i,inter,cfc,cfd,compte;
byte cle[] = new byte [17]; // holds key
char x1a0[] = new char [8];
short c;
/**
* Creates a PC1_OutputStream. Takes plain bytes, encrypts then
* and writes them to the underlying output stream specified in
* the constructor.
*
* @param out The output stream to decode.
* @param password 16 byte encryption key
*/
public PC1_OutputStream (OutputStream out, byte[] password) {
super(out);
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;
}
private 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);
}
/**
* Write out an encrypted byte
* @see java.io.FilterOutputStream
*/
public void write(int c) throws IOException {
assemble();
cfc=(char) (inter>>8);
cfd=(char) (inter&255); /* cfc^cfd = random byte */
/* K ZONE !!!!!!!!!!!!! */
/* here the mix of c and cle[compte] is before the encryption of c */
for (compte=0;compte<=15;compte++)
{
/* we mix the plaintext byte with the key */
cle[compte]=(byte) (cle[compte]^c);
}
c = c ^ (cfc^cfd);
out.write(c); /* we write the crypted byte */
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -