/*
* JEF - Copyright 2009-2010 Jiyi (mr.jiyi@gmail.com)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package jef.tools.security.cplus;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
/**
* Asiainfo提供的3DES算法,和C++版本的兼容。
* 原先的代码有点问题,不支持双字节码,已经修正。
* 总的来说功能和性能较差,仅为兼容某些C++加密出来的字符串使用。
* 在padding算法等地方和java以及C#的版本不兼容。
* @author Administrator
*/
public class TripleDES {
public TripleDES() {
}
public void Gsubkey(byte key[], byte subkey[][]) {
byte cup[] = new byte[4];
byte dup[] = new byte[4];
byte ci[] = new byte[4];
byte di[] = new byte[4];
byte lsi[] = new byte[16];
HByte ip1 = new HByte();
HByte ipr = new HByte();
ip1.setAbyte((byte) 0);
ipr.setAbyte((byte) 0);
lsi[0] = lsi[1] = lsi[8] = lsi[15] = 1;
lsi[2] = lsi[3] = lsi[4] = lsi[5] = lsi[6] = lsi[7] = 2;
lsi[9] = lsi[10] = lsi[11] = lsi[12] = lsi[13] = lsi[14] = 2;
ip1.setAbyte(key[0]);
ipr.ibyte.bit7 = ip1.ibyte.bit7;
ip1.setAbyte(key[1]);
ipr.ibyte.bit6 = ip1.ibyte.bit7;
ip1.setAbyte(key[2]);
ipr.ibyte.bit5 = ip1.ibyte.bit7;
ip1.setAbyte(key[3]);
ipr.ibyte.bit4 = ip1.ibyte.bit7;
ip1.setAbyte(key[4]);
ipr.ibyte.bit3 = ip1.ibyte.bit7;
ip1.setAbyte(key[5]);
ipr.ibyte.bit2 = ip1.ibyte.bit7;
ip1.setAbyte(key[6]);
ipr.ibyte.bit1 = ip1.ibyte.bit7;
ip1.setAbyte(key[7]);
ipr.ibyte.bit0 = ip1.ibyte.bit7;
ci[3] = ipr.getAbyte();
ip1.setAbyte(key[0]);
ipr.ibyte.bit7 = ip1.ibyte.bit6;
ip1.setAbyte(key[1]);
ipr.ibyte.bit6 = ip1.ibyte.bit6;
ip1.setAbyte(key[2]);
ipr.ibyte.bit5 = ip1.ibyte.bit6;
ip1.setAbyte(key[3]);
ipr.ibyte.bit4 = ip1.ibyte.bit6;
ip1.setAbyte(key[4]);
ipr.ibyte.bit3 = ip1.ibyte.bit6;
ip1.setAbyte(key[5]);
ipr.ibyte.bit2 = ip1.ibyte.bit6;
ip1.setAbyte(key[6]);
ipr.ibyte.bit1 = ip1.ibyte.bit6;
ip1.setAbyte(key[7]);
ipr.ibyte.bit0 = ip1.ibyte.bit6;
ci[2] = ipr.getAbyte();
ip1.setAbyte(key[0]);
ipr.ibyte.bit7 = ip1.ibyte.bit5;
ip1.setAbyte(key[1]);
ipr.ibyte.bit6 = ip1.ibyte.bit5;
ip1.setAbyte(key[2]);
ipr.ibyte.bit5 = ip1.ibyte.bit5;
ip1.setAbyte(key[3]);
ipr.ibyte.bit4 = ip1.ibyte.bit5;
ip1.setAbyte(key[4]);
ipr.ibyte.bit3 = ip1.ibyte.bit5;
ip1.setAbyte(key[5]);
ipr.ibyte.bit2 = ip1.ibyte.bit5;
ip1.setAbyte(key[6]);
ipr.ibyte.bit1 = ip1.ibyte.bit5;
ip1.setAbyte(key[7]);
ipr.ibyte.bit0 = ip1.ibyte.bit5;
ci[1] = ipr.getAbyte();
ip1.setAbyte(key[0]);
ipr.ibyte.bit7 = ip1.ibyte.bit4;
ip1.setAbyte(key[1]);
ipr.ibyte.bit6 = ip1.ibyte.bit4;
ip1.setAbyte(key[2]);
ipr.ibyte.bit5 = ip1.ibyte.bit4;
ip1.setAbyte(key[3]);
ipr.ibyte.bit4 = ip1.ibyte.bit4;
ci[0] = ipr.getAbyte();
ip1.setAbyte(key[0]);
ipr.ibyte.bit7 = ip1.ibyte.bit1;
ip1.setAbyte(key[1]);
ipr.ibyte.bit6 = ip1.ibyte.bit1;
ip1.setAbyte(key[2]);
ipr.ibyte.bit5 = ip1.ibyte.bit1;
ip1.setAbyte(key[3]);
ipr.ibyte.bit4 = ip1.ibyte.bit1;
ip1.setAbyte(key[4]);
ipr.ibyte.bit3 = ip1.ibyte.bit1;
ip1.setAbyte(key[5]);
ipr.ibyte.bit2 = ip1.ibyte.bit1;
ip1.setAbyte(key[6]);
ipr.ibyte.bit1 = ip1.ibyte.bit1;
ip1.setAbyte(key[7]);
ipr.ibyte.bit0 = ip1.ibyte.bit1;
di[3] = ipr.getAbyte();
ip1.setAbyte(key[0]);
ipr.ibyte.bit7 = ip1.ibyte.bit2;
ip1.setAbyte(key[1]);
ipr.ibyte.bit6 = ip1.ibyte.bit2;
ip1.setAbyte(key[2]);
ipr.ibyte.bit5 = ip1.ibyte.bit2;
ip1.setAbyte(key[3]);
ipr.ibyte.bit4 = ip1.ibyte.bit2;
ip1.setAbyte(key[4]);
ipr.ibyte.bit3 = ip1.ibyte.bit2;
ip1.setAbyte(key[5]);
ipr.ibyte.bit2 = ip1.ibyte.bit2;
ip1.setAbyte(key[6]);
ipr.ibyte.bit1 = ip1.ibyte.bit2;
ip1.setAbyte(key[7]);
ipr.ibyte.bit0 = ip1.ibyte.bit2;
di[2] = ipr.getAbyte();
ip1.setAbyte(key[0]);
ipr.ibyte.bit7 = ip1.ibyte.bit3;
ip1.setAbyte(key[1]);
ipr.ibyte.bit6 = ip1.ibyte.bit3;
ip1.setAbyte(key[2]);
ipr.ibyte.bit5 = ip1.ibyte.bit3;
ip1.setAbyte(key[3]);
ipr.ibyte.bit4 = ip1.ibyte.bit3;
ip1.setAbyte(key[4]);
ipr.ibyte.bit3 = ip1.ibyte.bit3;
ip1.setAbyte(key[5]);
ipr.ibyte.bit2 = ip1.ibyte.bit3;
ip1.setAbyte(key[6]);
ipr.ibyte.bit1 = ip1.ibyte.bit3;
ip1.setAbyte(key[7]);
ipr.ibyte.bit0 = ip1.ibyte.bit3;
di[1] = ipr.getAbyte();
ip1.setAbyte(key[4]);
ipr.ibyte.bit7 = ip1.ibyte.bit4;
ip1.setAbyte(key[5]);
ipr.ibyte.bit6 = ip1.ibyte.bit4;
ip1.setAbyte(key[6]);
ipr.ibyte.bit5 = ip1.ibyte.bit4;
ip1.setAbyte(key[7]);
ipr.ibyte.bit4 = ip1.ibyte.bit4;
di[0] = ipr.getAbyte();
for (int i = 0; i < 16; i++) {
cup[3] = ci[3];
cup[2] = ci[2];
cup[1] = ci[1];
cup[0] = ci[0];
dup[3] = di[3];
dup[2] = di[2];
dup[1] = di[1];
dup[0] = di[0];
rotatebits(cup, ci, lsi[i]);
rotatebits(dup, di, lsi[i]);
pc2(ci, di, subkey[i]);
}
}
void SDes(byte orientation, byte PlainText[], byte Key[], byte Encipher[]) {
byte m[] = new byte[8];
byte k[] = new byte[8];
m[0] = PlainText[7];
m[1] = PlainText[6];
m[2] = PlainText[5];
m[3] = PlainText[4];
m[4] = PlainText[3];
m[5] = PlainText[2];
m[6] = PlainText[1];
m[7] = PlainText[0];
k[0] = Key[7];
k[1] = Key[6];
k[2] = Key[5];
k[3] = Key[4];
k[4] = Key[3];
k[5] = Key[2];
k[6] = Key[1];
k[7] = Key[0];
if (orientation == 0)
des(m, k);
else
undes(m, k);
Encipher[0] = m[7];
Encipher[1] = m[6];
Encipher[2] = m[5];
Encipher[3] = m[4];
Encipher[4] = m[3];
Encipher[5] = m[2];
Encipher[6] = m[1];
Encipher[7] = m[0];
}
public void TDes(byte orientation, byte PlainText[], byte key[],
byte ucEncipher[]) {
byte En[] = new byte[8];
byte key2[] = new byte[key.length - 8];
if (orientation == 0) {
SDes((byte) 0, PlainText, key, En);
for (int i = 0; i < key2.length; i++)
key2[i] = key[i + 8];
SDes((byte) 1, En, key2, En);
for (int i = 0; i < key2.length; i++)
key[i + 8] = key2[i];
SDes((byte) 0, En, key, ucEncipher);
} else {
SDes((byte) 1, PlainText, key, En);
for (int i = 0; i < key2.length; i++)
key2[i] = key[i + 8];
SDes((byte) 0, En, key2, En);
for (int i = 0; i < key2.length; i++)
key[i + 8] = key2[i];
SDes((byte) 1, En, key, ucEncipher);
}
}
public byte asc_bcd(byte what1, byte what2) {
char digit = (char) (what1 < 97 ? what1 - 48 : (what1 - 97) + 10);
digit *= '\020';
digit += what2 < 97 ? ((char) (what2 - 48))
: ((char) ((what2 - 97) + 10));
return HByte.getByteFromChar(digit);
}
public String cipher2(byte key[], String plain_textStr) {
byte[] plain_text=plain_textStr.getBytes();
byte keyBytes[] = key;
byte t_plain[] = new byte[1024];
byte t_crypt[] = new byte[1024];
int pad_cnt = 0;
int length=plain_text.length;
if (length > 1024)
throw new IllegalArgumentException("length exceed");
for (int i = 0; i < plain_text.length; i++)
t_plain[i] = (byte) plain_text[i];
int en_cnt;
if (length % 8 == 0) {
en_cnt = length / 8;
} else {
en_cnt = length / 8 + 1;
pad_cnt = 8 - length % 8;
for (int i = 0; i < pad_cnt; i++)
t_plain[length + i] = 0;
}
for (int i = 0; i < en_cnt; i++) {
byte t_plain_tmp[] = new byte[t_plain.length - 8 * i];
byte t_crypt_tmp[] = new byte[t_crypt.length - 8 * i];
for (int j = 0; j < t_plain_tmp.length; j++)
t_plain_tmp[j] = t_plain[j + i * 8];
for (int j = 0; j < t_crypt_tmp.length; j++)
t_crypt_tmp[j] = t_crypt[j + i * 8];
TDes((byte) 0, t_plain_tmp, keyBytes, t_crypt_tmp);
for (int j = 0; j < t_plain_tmp.length; j++)
t_plain[j + i * 8] = t_plain_tmp[j];
for (int j = 0; j < t_crypt_tmp.length; j++)
t_crypt[j + i * 8] = t_crypt_tmp[j];
}
StringBuilder sb=new StringBuilder();
for (int i = 0; i < 8 * en_cnt; i++) {
byte temp = t_crypt[i];
if (temp < 10 && temp >= 0) {
sb.append("0" + temp);
} else {
String hexString = Integer.toHexString(HByte.getChar(temp));
if (temp > 0 && temp <= 15)
sb.append("0");
sb.append(hexString);
}
}
return sb.toString();
}
public void compress(byte in[], byte out[]) {
byte s[][][] = {
{
{ 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7 },
{ 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8 },
{ 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0 },
{ 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13 } },
{
{ 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10 },
{ 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5 },
{ 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15 },
{ 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9 } },
{
{ 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8 },
{ 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1 },
{ 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7 },
{ 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12 } },
{
{ 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15 },
{ 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9 },
{ 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4 },
{ 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14 } },
{
{ 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9 },
{ 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6 },
{ 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14 },
{ 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3 } },
{
{ 12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11 },
{ 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8 },
{ 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6 },
{ 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13 } },
{
{ 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1 },
{ 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6 },
{ 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2 },
{ 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12 } },
{
{ 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7 },
{ 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2 },
{ 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8 },
{ 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11 } } };
HByte ip1 = new HByte();
HByte ipr = new HByte();
byte tmp[] = new byte[8];
byte c[] = new byte[8];
ip1.setAbyte((byte) 0);
ipr.setAbyte((byte) 0);
ip1.setAbyte(in[5]);
ipr.ibyte.bit7 = ip1.ibyte.bit7;
ip1.setAbyte(in[5]);
ipr.ibyte.bit6 = ip1.ibyte.bit6;
ip1.setAbyte(in[5]);
ipr.ibyte.bit5 = ip1.ibyte.bit5;
ip1.setAbyte(in[5]);
ipr.ibyte.bit4 = ip1.ibyte.bit4;
ip1.setAbyte(in[5]);
ipr.ibyte.bit3 = ip1.ibyte.bit3;
ip1.setAbyte(in[5]);
ipr.ibyte.bit2 = ip1.ibyte.bit2;
ipr.ibyte.bit1 = '\0';
ipr.ibyte.bit0 = '\0';
tmp[7] = ipr.getAbyte();
ip1.setAbyte(in[5]);
ipr.ibyte.bit7 = ip1.ibyte.bit1;
ip1.setAbyte(in[5]);
ipr.ibyte.bit6 = ip1.ibyte.bit0;
ip1.setAbyte(in[4]);
ipr.ibyte.bit5 = ip1.ibyte.bit7;
ip1.setAbyte(in[4]);
ipr.ibyte.bit4 = ip1.ibyte.bit6;
ip1.setAbyte(in[4]);
ipr.ibyte.bit3 = ip1.ibyte.bit5;
ip1.setAbyte(in[4]);
ipr.ibyte.bit2 = ip1.ibyte.bit4;
ipr.ibyte.bit1 = '\0';
ipr.ibyte.bit0 = '\0';
tmp[6] = ipr.getAbyte();
ip1.setAbyte(in[4]);
ipr.ibyte.bit7 = ip1.ibyte.bit3;
ip1.setAbyte(in[4]);
ipr.ibyte.bit6 = ip1.ibyte.bit2;
ip1.setAbyte(in[4]);
ipr.ibyte.bit5 = ip1.ibyte.bit1;
ip1.setAbyte(in[4]);
ipr.ibyte.bit4 = ip1.ibyte.bit0;
ip1.setAbyte(in[3]);
ipr.ibyte.bit3 = ip1.ibyte.bit7;
ip1.setAbyte(in[3]);
ipr.ibyte.bit2 = ip1.ibyte.bit6;
ipr.ibyte.bit1 = '\0';
ipr.ibyte.bit0 = '\0';
tmp[5] = ipr.getAbyte();
ip1.setAbyte(in[3]);
ipr.ibyte.bit7 = ip1.ibyte.bit5;
ip1.setAbyte(in[3]);
ipr.ibyte.bit6 = ip1.ibyte.bit4;
ip1.setAbyte(in[3]);
ipr.ibyte.bit5 = ip1.ibyte.bit3;
ip1.setAbyte(in[3]);
ipr.ibyte.bit4 = ip1.ibyte.bit2;
ip1.setAbyte(in[3]);
ipr.ibyte.bit3 = ip1.ibyte.bit1;
ip1.setAbyte(in[3]);
ipr.ibyte.bit2 = ip1.ibyte.bit0;
ipr.ibyte.bit1 = '\0';
ipr.ibyte.bit0 = '\0';
tmp[4] = ipr.getAbyte();
ip1.setAbyte(in[2]);
ipr.ibyte.bit7 = ip1.ibyte.bit7;
ip1.setAbyte(in[2]);
ipr.ibyte.bit6 = ip1.ibyte.bit6;
ip1.setAbyte(in[2]);
ipr.ibyte.bit5 = ip1.ibyte.bit5;
ip1.setAbyte(in[2]);
ipr.ibyte.bit4 = ip1.ibyte.bit4;
ip1.setAbyte(in[2]);
ipr.ibyte.bit3 = ip1.ibyte.bit3;
ip1.setAbyte(in[2]);
ipr.ibyte.bit2 = ip1.ibyte.bit2;
ipr.ibyte.bit1 = '\0';
ipr.ibyte.bit0 = '\0';
tmp[3] = ipr.getAbyte();
ip1.setAbyte(in[2]);
ipr.ibyte.bit7 = ip1.ibyte.bit1;
ip1.setAbyte(in[2]);
ipr.ibyte.bit6 = ip1.ibyte.bit0;
ip1.setAbyte(in[1]);
ipr.ibyte.bit5 = ip1.ibyte.bit7;
ip1.setAbyte(in[1]);
ipr.ibyte.bit4 = ip1.ibyte.bit6;
ip1.setAbyte(in[1]);
ipr.ibyte.bit3 = ip1.ibyte.bit5;
ip1.setAbyte(in[1]);
ipr.ibyte.bit2 = ip1.ibyte.bit4;
ipr.ibyte.bit1 = '\0';
ipr.ibyte.bit0 = '\0';
tmp[2] = ipr.getAbyte();
ip1.setAbyte(in[1]);
ipr.ibyte.bit7 = ip1.ibyte.bit3;
ip1.setAbyte(in[1]);
ipr.ibyte.bit6 = ip1.ibyte.bit2;
ip1.setAbyte(in[1]);
ipr.ibyte.bit5 = ip1.ibyte.bit1;
ip1.setAbyte(in[1]);
ipr.ibyte.bit4 = ip1.ibyte.bit0;
ip1.setAbyte(in[0]);
ipr.ibyte.bit3 = ip1.ibyte.bit7;
ip1.setAbyte(in[0]);
ipr.ibyte.bit2 = ip1.ibyte.bit6;
ipr.ibyte.bit1 = '\0';
ipr.ibyte.bit0 = '\0';
tmp[1] = ipr.getAbyte();
ip1.setAbyte(in[0]);
ipr.ibyte.bit7 = ip1.ibyte.bit5;
ip1.setAbyte(in[0]);
ipr.ibyte.bit6 = ip1.ibyte.bit4;
ip1.setAbyte(in[0]);
ipr.ibyte.bit5 = ip1.ibyte.bit3;
ip1.setAbyte(in[0]);
ipr.ibyte.bit4 = ip1.ibyte.bit2;
ip1.setAbyte(in[0]);
ipr.ibyte.bit3 = ip1.ibyte.bit1;
ip1.setAbyte(in[0]);
ipr.ibyte.bit2 = ip1.ibyte.bit0;
ipr.ibyte.bit1 = '\0';
ipr.ibyte.bit0 = '\0';
tmp[0] = ipr.getAbyte();
for (int i = 7; i >= 0; i--) {
ip1.setAbyte(tmp[i]);
ipr.ibyte.bit1 = ip1.ibyte.bit7;
ipr.ibyte.bit0 = ip1.ibyte.bit2;
byte hang = (byte) (ipr.getAbyte() & 3);
ipr.ibyte.bit3 = ip1.ibyte.bit6;
ipr.ibyte.bit2 = ip1.ibyte.bit5;
ipr.ibyte.bit1 = ip1.ibyte.bit4;
ipr.ibyte.bit0 = ip1.ibyte.bit3;
byte lie = (byte) (ipr.getAbyte() & 15);
c[i] = s[7 - i][hang][lie];
}
out[3] = (byte) (c[7] << 4 | c[6]);
out[2] = (byte) (c[5] << 4 | c[4]);
out[1] = (byte) (c[3] << 4 | c[2]);
out[0] = (byte) (c[1] << 4 | c[0]);
}
public String decipher2(byte key[], String crypted_text) {
byte keyBytes[] = makeUpKey(key, 16);
byte t_crypt[] = new byte[1024];
byte plain_text[] = new byte[1024];
int length=crypted_text.length();
byte crypted_text_array[] = crypted_text.getBytes();
for (int i = 0; i < length / 2; i++)
t_crypt[i] = asc_bcd(crypted_text_array[i * 2],
crypted_text_array[i * 2 + 1]);
int en_cnt = length / 16;
for (int i = 0; i < en_cnt; i++) {
byte plain_text_tmp[] = new byte[plain_text.length - 8 * i];
byte t_crypt_tmp[] = new byte[t_crypt.length - 8 * i];
for (int j = 0; j < plain_text_tmp.length; j++)
plain_text_tmp[j] = plain_text[j + i * 8];
for (int j = 0; j < t_crypt_tmp.length; j++)
t_crypt_tmp[j] = t_crypt[j + i * 8];
TDes((byte) 1, t_crypt_tmp, keyBytes, plain_text_tmp);
for (int j = 0; j < plain_text_tmp.length; j++)
plain_text[j + i * 8] = plain_text_tmp[j];
for (int j = 0; j < t_crypt_tmp.length; j++)
t_crypt[j + i * 8] = t_crypt_tmp[j];
}
plain_text[length / 2] = 0;
int n=0;
for (int i = 0; i < plain_text.length; i++) {
if (plain_text[i] == 0){
n=i;
break;
}
}
try {
return new String(plain_text,0,n,Charset.defaultCharset().name());
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
public void des(byte m[], byte key[]) {
byte ip[] = new byte[8];
byte lin[] = new byte[4];
byte rin[] = new byte[4];
byte lup[] = new byte[4];
byte rup[] = new byte[4];
byte tmp[] = new byte[6];
byte tmp4[] = new byte[4];
byte subkey[][] = new byte[16][6];
HByte ip1 = new HByte();
HByte ipr = new HByte();
ip1.setAbyte((byte) 0);
ipr.setAbyte((byte) 0);
Gsubkey(key, subkey);
ip1.setAbyte(m[0]);
ipr.ibyte.bit7 = ip1.ibyte.bit6;
ip1.setAbyte(m[1]);
ipr.ibyte.bit6 = ip1.ibyte.bit6;
ip1.setAbyte(m[2]);
ipr.ibyte.bit5 = ip1.ibyte.bit6;
ip1.setAbyte(m[3]);
ipr.ibyte.bit4 = ip1.ibyte.bit6;
ip1.setAbyte(m[4]);
ipr.ibyte.bit3 = ip1.ibyte.bit6;
ip1.setAbyte(m[5]);
ipr.ibyte.bit2 = ip1.ibyte.bit6;
ip1.setAbyte(m[6]);
ipr.ibyte.bit1 = ip1.ibyte.bit6;
ip1.setAbyte(m[7]);
ipr.ibyte.bit0 = ip1.ibyte.bit6;
ip[7] = ipr.getAbyte();
ip1.setAbyte(m[0]);
ipr.ibyte.bit7 = ip1.ibyte.bit4;
ip1.setAbyte(m[1]);
ipr.ibyte.bit6 = ip1.ibyte.bit4;
ip1.setAbyte(m[2]);
ipr.ibyte.bit5 = ip1.ibyte.bit4;
ip1.setAbyte(m[3]);
ipr.ibyte.bit4 = ip1.ibyte.bit4;
ip1.setAbyte(m[4]);
ipr.ibyte.bit3 = ip1.ibyte.bit4;
ip1.setAbyte(m[5]);
ipr.ibyte.bit2 = ip1.ibyte.bit4;
ip1.setAbyte(m[6]);
ipr.ibyte.bit1 = ip1.ibyte.bit4;
ip1.setAbyte(m[7]);
ipr.ibyte.bit0 = ip1.ibyte.bit4;
ip[6] = ipr.getAbyte();
ip1.setAbyte(m[0]);
ipr.ibyte.bit7 = ip1.ibyte.bit2;
ip1.setAbyte(m[1]);
ipr.ibyte.bit6 = ip1.ibyte.bit2;
ip1.setAbyte(m[2]);
ipr.ibyte.bit5 = ip1.ibyte.bit2;
ip1.setAbyte(m[3]);
ipr.ibyte.bit4 = ip1.ibyte.bit2;
ip1.setAbyte(m[4]);
ipr.ibyte.bit3 = ip1.ibyte.bit2;
ip1.setAbyte(m[5]);
ipr.ibyte.bit2 = ip1.ibyte.bit2;
ip1.setAbyte(m[6]);
ipr.ibyte.bit1 = ip1.ibyte.bit2;
ip1.setAbyte(m[7]);
ipr.ibyte.bit0 = ip1.ibyte.bit2;
ip[5] = ipr.getAbyte();
ip1.setAbyte(m[0]);
ipr.ibyte.bit7 = ip1.ibyte.bit0;
ip1.setAbyte(m[1]);
ipr.ibyte.bit6 = ip1.ibyte.bit0;
ip1.setAbyte(m[2]);
ipr.ibyte.bit5 = ip1.ibyte.bit0;
ip1.setAbyte(m[3]);
ipr.ibyte.bit4 = ip1.ibyte.bit0;
ip1.setAbyte(m[4]);
ipr.ibyte.bit3 = ip1.ibyte.bit0;
ip1.setAbyte(m[5]);
ipr.ibyte.bit2 = ip1.ibyte.bit0;
ip1.setAbyte(m[6]);
ipr.ibyte.bit1 = ip1.ibyte.bit0;
ip1.setAbyte(m[7]);
ipr.ibyte.bit0 = ip1.ibyte.bit0;
ip[4] = ipr.getAbyte();
ip1.setAbyte(m[0]);
ipr.ibyte.bit7 = ip1.ibyte.bit7;
ip1.setAbyte(m[1]);
ipr.ibyte.bit6 = ip1.ibyte.bit7;
ip1.setAbyte(m[2]);
ipr.ibyte.bit5 = ip1.ibyte.bit7;
ip1.setAbyte(m[3]);
ipr.ibyte.bit4 = ip1.ibyte.bit7;
ip1.setAbyte(m[4]);
ipr.ibyte.bit3 = ip1.ibyte.bit7;
ip1.setAbyte(m[5]);
ipr.ibyte.bit2 = ip1.ibyte.bit7;
ip1.setAbyte(m[6]);
ipr.ibyte.bit1 = ip1.ibyte.bit7;
ip1.setAbyte(m[7]);
ipr.ibyte.bit0 = ip1.ibyte.bit7;
ip[3] = ipr.getAbyte();
ip1.setAbyte(m[0]);
ipr.ibyte.bit7 = ip1.ibyte.bit5;
ip1.setAbyte(m[1]);
ipr.ibyte.bit6 = ip1.ibyte.bit5;
ip1.setAbyte(m[2]);
ipr.ibyte.bit5 = ip1.ibyte.bit5;
ip1.setAbyte(m[3]);
ipr.ibyte.bit4 = ip1.ibyte.bit5;
ip1.setAbyte(m[4]);
ipr.ibyte.bit3 = ip1.ibyte.bit5;
ip1.setAbyte(m[5]);
ipr.ibyte.bit2 = ip1.ibyte.bit5;
ip1.setAbyte(m[6]);
ipr.ibyte.bit1 = ip1.ibyte.bit5;
ip1.setAbyte(m[7]);
ipr.ibyte.bit0 = ip1.ibyte.bit5;
ip[2] = ipr.getAbyte();
ip1.setAbyte(m[0]);
ipr.ibyte.bit7 = ip1.ibyte.bit3;
ip1.setAbyte(m[1]);
ipr.ibyte.bit6 = ip1.ibyte.bit3;
ip1.setAbyte(m[2]);
ipr.ibyte.bit5 = ip1.ibyte.bit3;
ip1.setAbyte(m[3]);
ipr.ibyte.bit4 = ip1.ibyte.bit3;
ip1.setAbyte(m[4]);
ipr.ibyte.bit3 = ip1.ibyte.bit3;
ip1.setAbyte(m[5]);
ipr.ibyte.bit2 = ip1.ibyte.bit3;
ip1.setAbyte(m[6]);
ipr.ibyte.bit1 = ip1.ibyte.bit3;
ip1.setAbyte(m[7]);
ipr.ibyte.bit0 = ip1.ibyte.bit3;
ip[1] = ipr.getAbyte();
ip1.setAbyte(m[0]);
ipr.ibyte.bit7 = ip1.ibyte.bit1;
ip1.setAbyte(m[1]);
ipr.ibyte.bit6 = ip1.ibyte.bit1;
ip1.setAbyte(m[2]);
ipr.ibyte.bit5 = ip1.ibyte.bit1;
ip1.setAbyte(m[3]);
ipr.ibyte.bit4 = ip1.ibyte.bit1;
ip1.setAbyte(m[4]);
ipr.ibyte.bit3 = ip1.ibyte.bit1;
ip1.setAbyte(m[5]);
ipr.ibyte.bit2 = ip1.ibyte.bit1;
ip1.setAbyte(m[6]);
ipr.ibyte.bit1 = ip1.ibyte.bit1;
ip1.setAbyte(m[7]);
ipr.ibyte.bit0 = ip1.ibyte.bit1;
ip[0] = ipr.getAbyte();
lin[3] = ip[7];
lin[2] = ip[6];
lin[1] = ip[5];
lin[0] = ip[4];
rin[3] = ip[3];
rin[2] = ip[2];
rin[1] = ip[1];
rin[0] = ip[0];
for (int j = 0; j < 16; j++) {
for (int i = 0; i < 4; i++)
lup[i] = lin[i];
for (int i = 0; i < 4; i++)
rup[i] = rin[i];
expand(rup, tmp);
for (int i = 0; i < 6; i++)
tmp[i] = (byte) (tmp[i] ^ subkey[j][i]);
compress(tmp, rin);
permutate(rin, tmp4);
for (int i = 0; i < 4; i++)
rin[i] = (byte) (lup[i] ^ tmp4[i]);
for (int i = 0; i < 4; i++)
lin[i] = rup[i];
}
for (int i = 0; i < 4; i++)
tmp4[i] = rin[i];
for (int i = 0; i < 4; i++)
rin[i] = lin[i];
for (int i = 0; i < 4; i++)
lin[i] = tmp4[i];
ip1.setAbyte(rin[3]);
ipr.ibyte.bit7 = ip1.ibyte.bit0;
ip1.setAbyte(lin[3]);
ipr.ibyte.bit6 = ip1.ibyte.bit0;
ip1.setAbyte(rin[2]);
ipr.ibyte.bit5 = ip1.ibyte.bit0;
ip1.setAbyte(lin[2]);
ipr.ibyte.bit4 = ip1.ibyte.bit0;
ip1.setAbyte(rin[1]);
ipr.ibyte.bit3 = ip1.ibyte.bit0;
ip1.setAbyte(lin[1]);
ipr.ibyte.bit2 = ip1.ibyte.bit0;
ip1.setAbyte(rin[0]);
ipr.ibyte.bit1 = ip1.ibyte.bit0;
ip1.setAbyte(lin[0]);
ipr.ibyte.bit0 = ip1.ibyte.bit0;
ip[7] = ipr.getAbyte();
ip1.setAbyte(rin[3]);
ipr.ibyte.bit7 = ip1.ibyte.bit1;
ip1.setAbyte(lin[3]);
ipr.ibyte.bit6 = ip1.ibyte.bit1;
ip1.setAbyte(rin[2]);
ipr.ibyte.bit5 = ip1.ibyte.bit1;
ip1.setAbyte(lin[2]);
ipr.ibyte.bit4 = ip1.ibyte.bit1;
ip1.setAbyte(rin[1]);
ipr.ibyte.bit3 = ip1.ibyte.bit1;
ip1.setAbyte(lin[1]);
ipr.ibyte.bit2 = ip1.ibyte.bit1;
ip1.setAbyte(rin[0]);
ipr.ibyte.bit1 = ip1.ibyte.bit1;
ip1.setAbyte(lin[0]);
ipr.ibyte.bit0 = ip1.ibyte.bit1;
ip[6] = ipr.getAbyte();
ip1.setAbyte(rin[3]);
ipr.ibyte.bit7 = ip1.ibyte.bit2;
ip1.setAbyte(lin[3]);
ipr.ibyte.bit6 = ip1.ibyte.bit2;
ip1.setAbyte(rin[2]);
ipr.ibyte.bit5 = ip1.ibyte.bit2;
ip1.setAbyte(lin[2]);
ipr.ibyte.bit4 = ip1.ibyte.bit2;
ip1.setAbyte(rin[1]);
ipr.ibyte.bit3 = ip1.ibyte.bit2;
ip1.setAbyte(lin[1]);
ipr.ibyte.bit2 = ip1.ibyte.bit2;
ip1.setAbyte(rin[0]);
ipr.ibyte.bit1 = ip1.ibyte.bit2;
ip1.setAbyte(lin[0]);
ipr.ibyte.bit0 = ip1.ibyte.bit2;
ip[5] = ipr.getAbyte();
ip1.setAbyte(rin[3]);
ipr.ibyte.bit7 = ip1.ibyte.bit3;
ip1.setAbyte(lin[3]);
ipr.ibyte.bit6 = ip1.ibyte.bit3;
ip1.setAbyte(rin[2]);
ipr.ibyte.bit5 = ip1.ibyte.bit3;
ip1.setAbyte(lin[2]);
ipr.ibyte.bit4 = ip1.ibyte.bit3;
ip1.setAbyte(rin[1]);
ipr.ibyte.bit3 = ip1.ibyte.bit3;
ip1.setAbyte(lin[1]);
ipr.ibyte.bit2 = ip1.ibyte.bit3;
ip1.setAbyte(rin[0]);
ipr.ibyte.bit1 = ip1.ibyte.bit3;
ip1.setAbyte(lin[0]);
ipr.ibyte.bit0 = ip1.ibyte.bit3;
ip[4] = ipr.getAbyte();
ip1.setAbyte(rin[3]);
ipr.ibyte.bit7 = ip1.ibyte.bit4;
ip1.setAbyte(lin[3]);
ipr.ibyte.bit6 = ip1.ibyte.bit4;
ip1.setAbyte(rin[2]);
ipr.ibyte.bit5 = ip1.ibyte.bit4;
ip1.setAbyte(lin[2]);
ipr.ibyte.bit4 = ip1.ibyte.bit4;
ip1.setAbyte(rin[1]);
ipr.ibyte.bit3 = ip1.ibyte.bit4;
ip1.setAbyte(lin[1]);
ipr.ibyte.bit2 = ip1.ibyte.bit4;
ip1.setAbyte(rin[0]);
ipr.ibyte.bit1 = ip1.ibyte.bit4;
ip1.setAbyte(lin[0]);
ipr.ibyte.bit0 = ip1.ibyte.bit4;
ip[3] = ipr.getAbyte();
ip1.setAbyte(rin[3]);
ipr.ibyte.bit7 = ip1.ibyte.bit5;
ip1.setAbyte(lin[3]);
ipr.ibyte.bit6 = ip1.ibyte.bit5;
ip1.setAbyte(rin[2]);
ipr.ibyte.bit5 = ip1.ibyte.bit5;
ip1.setAbyte(lin[2]);
ipr.ibyte.bit4 = ip1.ibyte.bit5;
ip1.setAbyte(rin[1]);
ipr.ibyte.bit3 = ip1.ibyte.bit5;
ip1.setAbyte(lin[1]);
ipr.ibyte.bit2 = ip1.ibyte.bit5;
ip1.setAbyte(rin[0]);
ipr.ibyte.bit1 = ip1.ibyte.bit5;
ip1.setAbyte(lin[0]);
ipr.ibyte.bit0 = ip1.ibyte.bit5;
ip[2] = ipr.getAbyte();
ip1.setAbyte(rin[3]);
ipr.ibyte.bit7 = ip1.ibyte.bit6;
ip1.setAbyte(lin[3]);
ipr.ibyte.bit6 = ip1.ibyte.bit6;
ip1.setAbyte(rin[2]);
ipr.ibyte.bit5 = ip1.ibyte.bit6;
ip1.setAbyte(lin[2]);
ipr.ibyte.bit4 = ip1.ibyte.bit6;
ip1.setAbyte(rin[1]);
ipr.ibyte.bit3 = ip1.ibyte.bit6;
ip1.setAbyte(lin[1]);
ipr.ibyte.bit2 = ip1.ibyte.bit6;
ip1.setAbyte(rin[0]);
ipr.ibyte.bit1 = ip1.ibyte.bit6;
ip1.setAbyte(lin[0]);
ipr.ibyte.bit0 = ip1.ibyte.bit6;
ip[1] = ipr.getAbyte();
ip1.setAbyte(rin[3]);
ipr.ibyte.bit7 = ip1.ibyte.bit7;
ip1.setAbyte(lin[3]);
ipr.ibyte.bit6 = ip1.ibyte.bit7;
ip1.setAbyte(rin[2]);
ipr.ibyte.bit5 = ip1.ibyte.bit7;
ip1.setAbyte(lin[2]);
ipr.ibyte.bit4 = ip1.ibyte.bit7;
ip1.setAbyte(rin[1]);
ipr.ibyte.bit3 = ip1.ibyte.bit7;
ip1.setAbyte(lin[1]);
ipr.ibyte.bit2 = ip1.ibyte.bit7;
ip1.setAbyte(rin[0]);
ipr.ibyte.bit1 = ip1.ibyte.bit7;
ip1.setAbyte(lin[0]);
ipr.ibyte.bit0 = ip1.ibyte.bit7;
ip[0] = ipr.getAbyte();
m[7] = ip[7];
m[6] = ip[6];
m[5] = ip[5];
m[4] = ip[4];
m[3] = ip[3];
m[2] = ip[2];
m[1] = ip[1];
m[0] = ip[0];
}
public void expand(byte in[], byte out[]) {
HByte ip1 = new HByte();
HByte ipr = new HByte();
ip1.setAbyte((byte) 0);
ipr.setAbyte((byte) 0);
ip1.setAbyte(in[0]);
ipr.ibyte.bit7 = ip1.ibyte.bit0;
ip1.setAbyte(in[3]);
ipr.ibyte.bit6 = ip1.ibyte.bit7;
ip1.setAbyte(in[3]);
ipr.ibyte.bit5 = ip1.ibyte.bit6;
ip1.setAbyte(in[3]);
ipr.ibyte.bit4 = ip1.ibyte.bit5;
ip1.setAbyte(in[3]);
ipr.ibyte.bit3 = ip1.ibyte.bit4;
ip1.setAbyte(in[3]);
ipr.ibyte.bit2 = ip1.ibyte.bit3;
ip1.setAbyte(in[3]);
ipr.ibyte.bit1 = ip1.ibyte.bit4;
ip1.setAbyte(in[3]);
ipr.ibyte.bit0 = ip1.ibyte.bit3;
out[5] = ipr.getAbyte();
ip1.setAbyte(in[3]);
ipr.ibyte.bit7 = ip1.ibyte.bit2;
ip1.setAbyte(in[3]);
ipr.ibyte.bit6 = ip1.ibyte.bit1;
ip1.setAbyte(in[3]);
ipr.ibyte.bit5 = ip1.ibyte.bit0;
ip1.setAbyte(in[2]);
ipr.ibyte.bit4 = ip1.ibyte.bit7;
ip1.setAbyte(in[3]);
ipr.ibyte.bit3 = ip1.ibyte.bit0;
ip1.setAbyte(in[2]);
ipr.ibyte.bit2 = ip1.ibyte.bit7;
ip1.setAbyte(in[2]);
ipr.ibyte.bit1 = ip1.ibyte.bit6;
ip1.setAbyte(in[2]);
ipr.ibyte.bit0 = ip1.ibyte.bit5;
out[4] = ipr.getAbyte();
ip1.setAbyte(in[2]);
ipr.ibyte.bit7 = ip1.ibyte.bit4;
ip1.setAbyte(in[2]);
ipr.ibyte.bit6 = ip1.ibyte.bit3;
ip1.setAbyte(in[2]);
ipr.ibyte.bit5 = ip1.ibyte.bit4;
ip1.setAbyte(in[2]);
ipr.ibyte.bit4 = ip1.ibyte.bit3;
ip1.setAbyte(in[2]);
ipr.ibyte.bit3 = ip1.ibyte.bit2;
ip1.setAbyte(in[2]);
ipr.ibyte.bit2 = ip1.ibyte.bit1;
ip1.setAbyte(in[2]);
ipr.ibyte.bit1 = ip1.ibyte.bit0;
ip1.setAbyte(in[1]);
ipr.ibyte.bit0 = ip1.ibyte.bit7;
out[3] = ipr.getAbyte();
ip1.setAbyte(in[2]);
ipr.ibyte.bit7 = ip1.ibyte.bit0;
ip1.setAbyte(in[1]);
ipr.ibyte.bit6 = ip1.ibyte.bit7;
ip1.setAbyte(in[1]);
ipr.ibyte.bit5 = ip1.ibyte.bit6;
ip1.setAbyte(in[1]);
ipr.ibyte.bit4 = ip1.ibyte.bit5;
ip1.setAbyte(in[1]);
ipr.ibyte.bit3 = ip1.ibyte.bit4;
ip1.setAbyte(in[1]);
ipr.ibyte.bit2 = ip1.ibyte.bit3;
ip1.setAbyte(in[1]);
ipr.ibyte.bit1 = ip1.ibyte.bit4;
ip1.setAbyte(in[1]);
ipr.ibyte.bit0 = ip1.ibyte.bit3;
out[2] = ipr.getAbyte();
ip1.setAbyte(in[1]);
ipr.ibyte.bit7 = ip1.ibyte.bit2;
ip1.setAbyte(in[1]);
ipr.ibyte.bit6 = ip1.ibyte.bit1;
ip1.setAbyte(in[1]);
ipr.ibyte.bit5 = ip1.ibyte.bit0;
ip1.setAbyte(in[0]);
ipr.ibyte.bit4 = ip1.ibyte.bit7;
ip1.setAbyte(in[1]);
ipr.ibyte.bit3 = ip1.ibyte.bit0;
ip1.setAbyte(in[0]);
ipr.ibyte.bit2 = ip1.ibyte.bit7;
ip1.setAbyte(in[0]);
ipr.ibyte.bit1 = ip1.ibyte.bit6;
ip1.setAbyte(in[0]);
ipr.ibyte.bit0 = ip1.ibyte.bit5;
out[1] = ipr.getAbyte();
ip1.setAbyte(in[0]);
ipr.ibyte.bit7 = ip1.ibyte.bit4;
ip1.setAbyte(in[0]);
ipr.ibyte.bit6 = ip1.ibyte.bit3;
ip1.setAbyte(in[0]);
ipr.ibyte.bit5 = ip1.ibyte.bit4;
ip1.setAbyte(in[0]);
ipr.ibyte.bit4 = ip1.ibyte.bit3;
ip1.setAbyte(in[0]);
ipr.ibyte.bit3 = ip1.ibyte.bit2;
ip1.setAbyte(in[0]);
ipr.ibyte.bit2 = ip1.ibyte.bit1;
ip1.setAbyte(in[0]);
ipr.ibyte.bit1 = ip1.ibyte.bit0;
ip1.setAbyte(in[3]);
ipr.ibyte.bit0 = ip1.ibyte.bit7;
out[0] = ipr.getAbyte();
}
public byte[] makeUpKey(byte key[], int length) {
if (key.length < length) {
byte result[] = new byte[length];
for (int i = 0; i < key.length; i++)
result[i] = key[i];
return result;
} else {
return key;
}
}
public void pc2(byte keyc[], byte keyd[], byte subkey[]) {
HByte ip1 = new HByte();
HByte ipr = new HByte();
ip1.setAbyte((byte) 0);
ipr.setAbyte((byte) 0);
ip1.setAbyte(keyc[2]);
ipr.ibyte.bit7 = ip1.ibyte.bit2;
ip1.setAbyte(keyc[1]);
ipr.ibyte.bit6 = ip1.ibyte.bit7;
ip1.setAbyte(keyc[2]);
ipr.ibyte.bit5 = ip1.ibyte.bit5;
ip1.setAbyte(keyc[1]);
ipr.ibyte.bit4 = ip1.ibyte.bit0;
ip1.setAbyte(keyc[3]);
ipr.ibyte.bit3 = ip1.ibyte.bit7;
ip1.setAbyte(keyc[3]);
ipr.ibyte.bit2 = ip1.ibyte.bit3;
ip1.setAbyte(keyc[3]);
ipr.ibyte.bit1 = ip1.ibyte.bit5;
ip1.setAbyte(keyc[0]);
ipr.ibyte.bit0 = ip1.ibyte.bit4;
subkey[5] = ipr.getAbyte();
ip1.setAbyte(keyc[2]);
ipr.ibyte.bit7 = ip1.ibyte.bit1;
ip1.setAbyte(keyc[3]);
ipr.ibyte.bit6 = ip1.ibyte.bit2;
ip1.setAbyte(keyc[1]);
ipr.ibyte.bit5 = ip1.ibyte.bit3;
ip1.setAbyte(keyc[2]);
ipr.ibyte.bit4 = ip1.ibyte.bit6;
ip1.setAbyte(keyc[1]);
ipr.ibyte.bit3 = ip1.ibyte.bit1;
ip1.setAbyte(keyc[1]);
ipr.ibyte.bit2 = ip1.ibyte.bit5;
ip1.setAbyte(keyc[2]);
ipr.ibyte.bit1 = ip1.ibyte.bit4;
ip1.setAbyte(keyc[3]);
ipr.ibyte.bit0 = ip1.ibyte.bit4;
subkey[4] = ipr.getAbyte();
ip1.setAbyte(keyc[0]);
ipr.ibyte.bit7 = ip1.ibyte.bit6;
ip1.setAbyte(keyc[3]);
ipr.ibyte.bit6 = ip1.ibyte.bit0;
ip1.setAbyte(keyc[2]);
ipr.ibyte.bit5 = ip1.ibyte.bit0;
ip1.setAbyte(keyc[3]);
ipr.ibyte.bit4 = ip1.ibyte.bit1;
ip1.setAbyte(keyc[0]);
ipr.ibyte.bit3 = ip1.ibyte.bit5;
ip1.setAbyte(keyc[1]);
ipr.ibyte.bit2 = ip1.ibyte.bit4;
ip1.setAbyte(keyc[2]);
ipr.ibyte.bit1 = ip1.ibyte.bit3;
ip1.setAbyte(keyc[3]);
ipr.ibyte.bit0 = ip1.ibyte.bit6;
subkey[3] = ipr.getAbyte();
ip1.setAbyte(keyd[2]);
ipr.ibyte.bit7 = ip1.ibyte.bit3;
ip1.setAbyte(keyd[1]);
ipr.ibyte.bit6 = ip1.ibyte.bit0;
ip1.setAbyte(keyd[3]);
ipr.ibyte.bit5 = ip1.ibyte.bit5;
ip1.setAbyte(keyd[2]);
ipr.ibyte.bit4 = ip1.ibyte.bit7;
ip1.setAbyte(keyd[1]);
ipr.ibyte.bit3 = ip1.ibyte.bit5;
ip1.setAbyte(keyd[0]);
ipr.ibyte.bit2 = ip1.ibyte.bit5;
ip1.setAbyte(keyd[3]);
ipr.ibyte.bit1 = ip1.ibyte.bit6;
ip1.setAbyte(keyd[2]);
ipr.ibyte.bit0 = ip1.ibyte.bit4;
subkey[2] = ipr.getAbyte();
ip1.setAbyte(keyd[1]);
ipr.ibyte.bit7 = ip1.ibyte.bit1;
ip1.setAbyte(keyd[1]);
ipr.ibyte.bit6 = ip1.ibyte.bit7;
ip1.setAbyte(keyd[3]);
ipr.ibyte.bit5 = ip1.ibyte.bit3;
ip1.setAbyte(keyd[1]);
ipr.ibyte.bit4 = ip1.ibyte.bit4;
ip1.setAbyte(keyd[2]);
ipr.ibyte.bit3 = ip1.ibyte.bit0;
ip1.setAbyte(keyd[1]);
ipr.ibyte.bit2 = ip1.ibyte.bit3;
ip1.setAbyte(keyd[2]);
ipr.ibyte.bit1 = ip1.ibyte.bit5;
ip1.setAbyte(keyd[0]);
ipr.ibyte.bit0 = ip1.ibyte.bit4;
subkey[1] = ipr.getAbyte();
ip1.setAbyte(keyd[3]);
ipr.ibyte.bit7 = ip1.ibyte.bit2;
ip1.setAbyte(keyd[0]);
ipr.ibyte.bit6 = ip1.ibyte.bit7;
ip1.setAbyte(keyd[1]);
ipr.ibyte.bit5 = ip1.ibyte.bit6;
ip1.setAbyte(keyd[2]);
ipr.ibyte.bit4 = ip1.ibyte.bit2;
ip1.setAbyte(keyd[1]);
ipr.ibyte.bit3 = ip1.ibyte.bit2;
ip1.setAbyte(keyd[3]);
ipr.ibyte.bit2 = ip1.ibyte.bit0;
ip1.setAbyte(keyd[3]);
ipr.ibyte.bit1 = ip1.ibyte.bit7;
ip1.setAbyte(keyd[3]);
ipr.ibyte.bit0 = ip1.ibyte.bit4;
subkey[0] = ipr.getAbyte();
}
public void permutate(byte in[], byte out[]) {
HByte ip1 = new HByte();
HByte ipr = new HByte();
ip1.setAbyte((byte) 0);
ipr.setAbyte((byte) 0);
ip1.setAbyte(in[2]);
ipr.ibyte.bit7 = ip1.ibyte.bit0;
ip1.setAbyte(in[3]);
ipr.ibyte.bit6 = ip1.ibyte.bit1;
ip1.setAbyte(in[1]);
ipr.ibyte.bit5 = ip1.ibyte.bit4;
ip1.setAbyte(in[1]);
ipr.ibyte.bit4 = ip1.ibyte.bit3;
ip1.setAbyte(in[0]);
ipr.ibyte.bit3 = ip1.ibyte.bit3;
ip1.setAbyte(in[2]);
ipr.ibyte.bit2 = ip1.ibyte.bit4;
ip1.setAbyte(in[0]);
ipr.ibyte.bit1 = ip1.ibyte.bit4;
ip1.setAbyte(in[1]);
ipr.ibyte.bit0 = ip1.ibyte.bit7;
out[3] = ipr.getAbyte();
ip1.setAbyte(in[3]);
ipr.ibyte.bit7 = ip1.ibyte.bit7;
ip1.setAbyte(in[2]);
ipr.ibyte.bit6 = ip1.ibyte.bit1;
ip1.setAbyte(in[1]);
ipr.ibyte.bit5 = ip1.ibyte.bit1;
ip1.setAbyte(in[0]);
ipr.ibyte.bit4 = ip1.ibyte.bit6;
ip1.setAbyte(in[3]);
ipr.ibyte.bit3 = ip1.ibyte.bit3;
ip1.setAbyte(in[1]);
ipr.ibyte.bit2 = ip1.ibyte.bit6;
ip1.setAbyte(in[0]);
ipr.ibyte.bit1 = ip1.ibyte.bit1;
ip1.setAbyte(in[2]);
ipr.ibyte.bit0 = ip1.ibyte.bit6;
out[2] = ipr.getAbyte();
ip1.setAbyte(in[3]);
ipr.ibyte.bit7 = ip1.ibyte.bit6;
ip1.setAbyte(in[3]);
ipr.ibyte.bit6 = ip1.ibyte.bit0;
ip1.setAbyte(in[1]);
ipr.ibyte.bit5 = ip1.ibyte.bit0;
ip1.setAbyte(in[2]);
ipr.ibyte.bit4 = ip1.ibyte.bit2;
ip1.setAbyte(in[0]);
ipr.ibyte.bit3 = ip1.ibyte.bit0;
ip1.setAbyte(in[0]);
ipr.ibyte.bit2 = ip1.ibyte.bit5;
ip1.setAbyte(in[3]);
ipr.ibyte.bit1 = ip1.ibyte.bit5;
ip1.setAbyte(in[2]);
ipr.ibyte.bit0 = ip1.ibyte.bit7;
out[1] = ipr.getAbyte();
ip1.setAbyte(in[1]);
ipr.ibyte.bit7 = ip1.ibyte.bit5;
ip1.setAbyte(in[2]);
ipr.ibyte.bit6 = ip1.ibyte.bit3;
ip1.setAbyte(in[0]);
ipr.ibyte.bit5 = ip1.ibyte.bit2;
ip1.setAbyte(in[3]);
ipr.ibyte.bit4 = ip1.ibyte.bit2;
ip1.setAbyte(in[1]);
ipr.ibyte.bit3 = ip1.ibyte.bit2;
ip1.setAbyte(in[2]);
ipr.ibyte.bit2 = ip1.ibyte.bit5;
ip1.setAbyte(in[3]);
ipr.ibyte.bit1 = ip1.ibyte.bit4;
ip1.setAbyte(in[0]);
ipr.ibyte.bit0 = ip1.ibyte.bit7;
out[0] = ipr.getAbyte();
}
public void rotatebits(byte key[], byte skey[], byte bits) {
HByte c[] = new HByte[4];
HByte d[] = new HByte[4];
for (int i = 0; i < c.length; i++) {
c[i] = new HByte();
d[i] = new HByte();
}
c[0].setAbyte(key[0]);
c[1].setAbyte(key[1]);
c[2].setAbyte(key[2]);
c[3].setAbyte(key[3]);
if (bits == 1) {
d[0].ibyte.bit4 = c[3].ibyte.bit7;
d[0].ibyte.bit5 = c[0].ibyte.bit4;
d[0].ibyte.bit6 = c[0].ibyte.bit5;
d[0].ibyte.bit7 = c[0].ibyte.bit6;
d[1].ibyte.bit0 = c[0].ibyte.bit7;
d[1].ibyte.bit1 = c[1].ibyte.bit0;
d[1].ibyte.bit2 = c[1].ibyte.bit1;
d[1].ibyte.bit3 = c[1].ibyte.bit2;
d[1].ibyte.bit4 = c[1].ibyte.bit3;
d[1].ibyte.bit5 = c[1].ibyte.bit4;
d[1].ibyte.bit6 = c[1].ibyte.bit5;
d[1].ibyte.bit7 = c[1].ibyte.bit6;
d[2].ibyte.bit0 = c[1].ibyte.bit7;
d[2].ibyte.bit1 = c[2].ibyte.bit0;
d[2].ibyte.bit2 = c[2].ibyte.bit1;
d[2].ibyte.bit3 = c[2].ibyte.bit2;
d[2].ibyte.bit4 = c[2].ibyte.bit3;
d[2].ibyte.bit5 = c[2].ibyte.bit4;
d[2].ibyte.bit6 = c[2].ibyte.bit5;
d[2].ibyte.bit7 = c[2].ibyte.bit6;
d[3].ibyte.bit0 = c[2].ibyte.bit7;
d[3].ibyte.bit1 = c[3].ibyte.bit0;
d[3].ibyte.bit2 = c[3].ibyte.bit1;
d[3].ibyte.bit3 = c[3].ibyte.bit2;
d[3].ibyte.bit4 = c[3].ibyte.bit3;
d[3].ibyte.bit5 = c[3].ibyte.bit4;
d[3].ibyte.bit6 = c[3].ibyte.bit5;
d[3].ibyte.bit7 = c[3].ibyte.bit6;
} else {
d[0].ibyte.bit4 = c[3].ibyte.bit6;
d[0].ibyte.bit5 = c[3].ibyte.bit7;
d[0].ibyte.bit6 = c[0].ibyte.bit4;
d[0].ibyte.bit7 = c[0].ibyte.bit5;
d[1].ibyte.bit0 = c[0].ibyte.bit6;
d[1].ibyte.bit1 = c[0].ibyte.bit7;
d[1].ibyte.bit2 = c[1].ibyte.bit0;
d[1].ibyte.bit3 = c[1].ibyte.bit1;
d[1].ibyte.bit4 = c[1].ibyte.bit2;
d[1].ibyte.bit5 = c[1].ibyte.bit3;
d[1].ibyte.bit6 = c[1].ibyte.bit4;
d[1].ibyte.bit7 = c[1].ibyte.bit5;
d[2].ibyte.bit0 = c[1].ibyte.bit6;
d[2].ibyte.bit1 = c[1].ibyte.bit7;
d[2].ibyte.bit2 = c[2].ibyte.bit0;
d[2].ibyte.bit3 = c[2].ibyte.bit1;
d[2].ibyte.bit4 = c[2].ibyte.bit2;
d[2].ibyte.bit5 = c[2].ibyte.bit3;
d[2].ibyte.bit6 = c[2].ibyte.bit4;
d[2].ibyte.bit7 = c[2].ibyte.bit5;
d[3].ibyte.bit0 = c[2].ibyte.bit6;
d[3].ibyte.bit1 = c[2].ibyte.bit7;
d[3].ibyte.bit2 = c[3].ibyte.bit0;
d[3].ibyte.bit3 = c[3].ibyte.bit1;
d[3].ibyte.bit4 = c[3].ibyte.bit2;
d[3].ibyte.bit5 = c[3].ibyte.bit3;
d[3].ibyte.bit6 = c[3].ibyte.bit4;
d[3].ibyte.bit7 = c[3].ibyte.bit5;
}
skey[0] = d[0].getAbyte();
skey[1] = d[1].getAbyte();
skey[2] = d[2].getAbyte();
skey[3] = d[3].getAbyte();
}
public void undes(byte m[], byte key[]) {
byte ip[] = new byte[8];
byte lin[] = new byte[4];
byte rin[] = new byte[4];
byte lup[] = new byte[4];
byte rup[] = new byte[4];
byte tmp[] = new byte[6];
byte tmp4[] = new byte[4];
byte subkey[][] = new byte[16][6];
HByte ip1 = new HByte();
HByte ipr = new HByte();
ip1.setAbyte((byte) 0);
ipr.setAbyte((byte) 0);
Gsubkey(key, subkey);
ip1.setAbyte(m[0]);
ipr.ibyte.bit7 = ip1.ibyte.bit6;
ip1.setAbyte(m[1]);
ipr.ibyte.bit6 = ip1.ibyte.bit6;
ip1.setAbyte(m[2]);
ipr.ibyte.bit5 = ip1.ibyte.bit6;
ip1.setAbyte(m[3]);
ipr.ibyte.bit4 = ip1.ibyte.bit6;
ip1.setAbyte(m[4]);
ipr.ibyte.bit3 = ip1.ibyte.bit6;
ip1.setAbyte(m[5]);
ipr.ibyte.bit2 = ip1.ibyte.bit6;
ip1.setAbyte(m[6]);
ipr.ibyte.bit1 = ip1.ibyte.bit6;
ip1.setAbyte(m[7]);
ipr.ibyte.bit0 = ip1.ibyte.bit6;
ip[7] = ipr.getAbyte();
ip1.setAbyte(m[0]);
ipr.ibyte.bit7 = ip1.ibyte.bit4;
ip1.setAbyte(m[1]);
ipr.ibyte.bit6 = ip1.ibyte.bit4;
ip1.setAbyte(m[2]);
ipr.ibyte.bit5 = ip1.ibyte.bit4;
ip1.setAbyte(m[3]);
ipr.ibyte.bit4 = ip1.ibyte.bit4;
ip1.setAbyte(m[4]);
ipr.ibyte.bit3 = ip1.ibyte.bit4;
ip1.setAbyte(m[5]);
ipr.ibyte.bit2 = ip1.ibyte.bit4;
ip1.setAbyte(m[6]);
ipr.ibyte.bit1 = ip1.ibyte.bit4;
ip1.setAbyte(m[7]);
ipr.ibyte.bit0 = ip1.ibyte.bit4;
ip[6] = ipr.getAbyte();
ip1.setAbyte(m[0]);
ipr.ibyte.bit7 = ip1.ibyte.bit2;
ip1.setAbyte(m[1]);
ipr.ibyte.bit6 = ip1.ibyte.bit2;
ip1.setAbyte(m[2]);
ipr.ibyte.bit5 = ip1.ibyte.bit2;
ip1.setAbyte(m[3]);
ipr.ibyte.bit4 = ip1.ibyte.bit2;
ip1.setAbyte(m[4]);
ipr.ibyte.bit3 = ip1.ibyte.bit2;
ip1.setAbyte(m[5]);
ipr.ibyte.bit2 = ip1.ibyte.bit2;
ip1.setAbyte(m[6]);
ipr.ibyte.bit1 = ip1.ibyte.bit2;
ip1.setAbyte(m[7]);
ipr.ibyte.bit0 = ip1.ibyte.bit2;
ip[5] = ipr.getAbyte();
ip1.setAbyte(m[0]);
ipr.ibyte.bit7 = ip1.ibyte.bit0;
ip1.setAbyte(m[1]);
ipr.ibyte.bit6 = ip1.ibyte.bit0;
ip1.setAbyte(m[2]);
ipr.ibyte.bit5 = ip1.ibyte.bit0;
ip1.setAbyte(m[3]);
ipr.ibyte.bit4 = ip1.ibyte.bit0;
ip1.setAbyte(m[4]);
ipr.ibyte.bit3 = ip1.ibyte.bit0;
ip1.setAbyte(m[5]);
ipr.ibyte.bit2 = ip1.ibyte.bit0;
ip1.setAbyte(m[6]);
ipr.ibyte.bit1 = ip1.ibyte.bit0;
ip1.setAbyte(m[7]);
ipr.ibyte.bit0 = ip1.ibyte.bit0;
ip[4] = ipr.getAbyte();
ip1.setAbyte(m[0]);
ipr.ibyte.bit7 = ip1.ibyte.bit7;
ip1.setAbyte(m[1]);
ipr.ibyte.bit6 = ip1.ibyte.bit7;
ip1.setAbyte(m[2]);
ipr.ibyte.bit5 = ip1.ibyte.bit7;
ip1.setAbyte(m[3]);
ipr.ibyte.bit4 = ip1.ibyte.bit7;
ip1.setAbyte(m[4]);
ipr.ibyte.bit3 = ip1.ibyte.bit7;
ip1.setAbyte(m[5]);
ipr.ibyte.bit2 = ip1.ibyte.bit7;
ip1.setAbyte(m[6]);
ipr.ibyte.bit1 = ip1.ibyte.bit7;
ip1.setAbyte(m[7]);
ipr.ibyte.bit0 = ip1.ibyte.bit7;
ip[3] = ipr.getAbyte();
ip1.setAbyte(m[0]);
ipr.ibyte.bit7 = ip1.ibyte.bit5;
ip1.setAbyte(m[1]);
ipr.ibyte.bit6 = ip1.ibyte.bit5;
ip1.setAbyte(m[2]);
ipr.ibyte.bit5 = ip1.ibyte.bit5;
ip1.setAbyte(m[3]);
ipr.ibyte.bit4 = ip1.ibyte.bit5;
ip1.setAbyte(m[4]);
ipr.ibyte.bit3 = ip1.ibyte.bit5;
ip1.setAbyte(m[5]);
ipr.ibyte.bit2 = ip1.ibyte.bit5;
ip1.setAbyte(m[6]);
ipr.ibyte.bit1 = ip1.ibyte.bit5;
ip1.setAbyte(m[7]);
ipr.ibyte.bit0 = ip1.ibyte.bit5;
ip[2] = ipr.getAbyte();
ip1.setAbyte(m[0]);
ipr.ibyte.bit7 = ip1.ibyte.bit3;
ip1.setAbyte(m[1]);
ipr.ibyte.bit6 = ip1.ibyte.bit3;
ip1.setAbyte(m[2]);
ipr.ibyte.bit5 = ip1.ibyte.bit3;
ip1.setAbyte(m[3]);
ipr.ibyte.bit4 = ip1.ibyte.bit3;
ip1.setAbyte(m[4]);
ipr.ibyte.bit3 = ip1.ibyte.bit3;
ip1.setAbyte(m[5]);
ipr.ibyte.bit2 = ip1.ibyte.bit3;
ip1.setAbyte(m[6]);
ipr.ibyte.bit1 = ip1.ibyte.bit3;
ip1.setAbyte(m[7]);
ipr.ibyte.bit0 = ip1.ibyte.bit3;
ip[1] = ipr.getAbyte();
ip1.setAbyte(m[0]);
ipr.ibyte.bit7 = ip1.ibyte.bit1;
ip1.setAbyte(m[1]);
ipr.ibyte.bit6 = ip1.ibyte.bit1;
ip1.setAbyte(m[2]);
ipr.ibyte.bit5 = ip1.ibyte.bit1;
ip1.setAbyte(m[3]);
ipr.ibyte.bit4 = ip1.ibyte.bit1;
ip1.setAbyte(m[4]);
ipr.ibyte.bit3 = ip1.ibyte.bit1;
ip1.setAbyte(m[5]);
ipr.ibyte.bit2 = ip1.ibyte.bit1;
ip1.setAbyte(m[6]);
ipr.ibyte.bit1 = ip1.ibyte.bit1;
ip1.setAbyte(m[7]);
ipr.ibyte.bit0 = ip1.ibyte.bit1;
ip[0] = ipr.getAbyte();
lin[3] = ip[7];
lin[2] = ip[6];
lin[1] = ip[5];
lin[0] = ip[4];
rin[3] = ip[3];
rin[2] = ip[2];
rin[1] = ip[1];
rin[0] = ip[0];
for (int j = 0; j < 16; j++) {
for (int i = 0; i < 4; i++)
lup[i] = lin[i];
for (int i = 0; i < 4; i++)
rup[i] = rin[i];
expand(rup, tmp);
for (int i = 0; i < 6; i++)
tmp[i] = (byte) (tmp[i] ^ subkey[15 - j][i]);
compress(tmp, rin);
permutate(rin, tmp4);
for (int i = 0; i < 4; i++)
rin[i] = (byte) (lup[i] ^ tmp4[i]);
for (int i = 0; i < 4; i++)
lin[i] = rup[i];
}
for (int i = 0; i < 4; i++)
tmp4[i] = rin[i];
for (int i = 0; i < 4; i++)
rin[i] = lin[i];
for (int i = 0; i < 4; i++)
lin[i] = tmp4[i];
ip1.setAbyte(rin[3]);
ipr.ibyte.bit7 = ip1.ibyte.bit0;
ip1.setAbyte(lin[3]);
ipr.ibyte.bit6 = ip1.ibyte.bit0;
ip1.setAbyte(rin[2]);
ipr.ibyte.bit5 = ip1.ibyte.bit0;
ip1.setAbyte(lin[2]);
ipr.ibyte.bit4 = ip1.ibyte.bit0;
ip1.setAbyte(rin[1]);
ipr.ibyte.bit3 = ip1.ibyte.bit0;
ip1.setAbyte(lin[1]);
ipr.ibyte.bit2 = ip1.ibyte.bit0;
ip1.setAbyte(rin[0]);
ipr.ibyte.bit1 = ip1.ibyte.bit0;
ip1.setAbyte(lin[0]);
ipr.ibyte.bit0 = ip1.ibyte.bit0;
ip[7] = ipr.getAbyte();
ip1.setAbyte(rin[3]);
ipr.ibyte.bit7 = ip1.ibyte.bit1;
ip1.setAbyte(lin[3]);
ipr.ibyte.bit6 = ip1.ibyte.bit1;
ip1.setAbyte(rin[2]);
ipr.ibyte.bit5 = ip1.ibyte.bit1;
ip1.setAbyte(lin[2]);
ipr.ibyte.bit4 = ip1.ibyte.bit1;
ip1.setAbyte(rin[1]);
ipr.ibyte.bit3 = ip1.ibyte.bit1;
ip1.setAbyte(lin[1]);
ipr.ibyte.bit2 = ip1.ibyte.bit1;
ip1.setAbyte(rin[0]);
ipr.ibyte.bit1 = ip1.ibyte.bit1;
ip1.setAbyte(lin[0]);
ipr.ibyte.bit0 = ip1.ibyte.bit1;
ip[6] = ipr.getAbyte();
ip1.setAbyte(rin[3]);
ipr.ibyte.bit7 = ip1.ibyte.bit2;
ip1.setAbyte(lin[3]);
ipr.ibyte.bit6 = ip1.ibyte.bit2;
ip1.setAbyte(rin[2]);
ipr.ibyte.bit5 = ip1.ibyte.bit2;
ip1.setAbyte(lin[2]);
ipr.ibyte.bit4 = ip1.ibyte.bit2;
ip1.setAbyte(rin[1]);
ipr.ibyte.bit3 = ip1.ibyte.bit2;
ip1.setAbyte(lin[1]);
ipr.ibyte.bit2 = ip1.ibyte.bit2;
ip1.setAbyte(rin[0]);
ipr.ibyte.bit1 = ip1.ibyte.bit2;
ip1.setAbyte(lin[0]);
ipr.ibyte.bit0 = ip1.ibyte.bit2;
ip[5] = ipr.getAbyte();
ip1.setAbyte(rin[3]);
ipr.ibyte.bit7 = ip1.ibyte.bit3;
ip1.setAbyte(lin[3]);
ipr.ibyte.bit6 = ip1.ibyte.bit3;
ip1.setAbyte(rin[2]);
ipr.ibyte.bit5 = ip1.ibyte.bit3;
ip1.setAbyte(lin[2]);
ipr.ibyte.bit4 = ip1.ibyte.bit3;
ip1.setAbyte(rin[1]);
ipr.ibyte.bit3 = ip1.ibyte.bit3;
ip1.setAbyte(lin[1]);
ipr.ibyte.bit2 = ip1.ibyte.bit3;
ip1.setAbyte(rin[0]);
ipr.ibyte.bit1 = ip1.ibyte.bit3;
ip1.setAbyte(lin[0]);
ipr.ibyte.bit0 = ip1.ibyte.bit3;
ip[4] = ipr.getAbyte();
ip1.setAbyte(rin[3]);
ipr.ibyte.bit7 = ip1.ibyte.bit4;
ip1.setAbyte(lin[3]);
ipr.ibyte.bit6 = ip1.ibyte.bit4;
ip1.setAbyte(rin[2]);
ipr.ibyte.bit5 = ip1.ibyte.bit4;
ip1.setAbyte(lin[2]);
ipr.ibyte.bit4 = ip1.ibyte.bit4;
ip1.setAbyte(rin[1]);
ipr.ibyte.bit3 = ip1.ibyte.bit4;
ip1.setAbyte(lin[1]);
ipr.ibyte.bit2 = ip1.ibyte.bit4;
ip1.setAbyte(rin[0]);
ipr.ibyte.bit1 = ip1.ibyte.bit4;
ip1.setAbyte(lin[0]);
ipr.ibyte.bit0 = ip1.ibyte.bit4;
ip[3] = ipr.getAbyte();
ip1.setAbyte(rin[3]);
ipr.ibyte.bit7 = ip1.ibyte.bit5;
ip1.setAbyte(lin[3]);
ipr.ibyte.bit6 = ip1.ibyte.bit5;
ip1.setAbyte(rin[2]);
ipr.ibyte.bit5 = ip1.ibyte.bit5;
ip1.setAbyte(lin[2]);
ipr.ibyte.bit4 = ip1.ibyte.bit5;
ip1.setAbyte(rin[1]);
ipr.ibyte.bit3 = ip1.ibyte.bit5;
ip1.setAbyte(lin[1]);
ipr.ibyte.bit2 = ip1.ibyte.bit5;
ip1.setAbyte(rin[0]);
ipr.ibyte.bit1 = ip1.ibyte.bit5;
ip1.setAbyte(lin[0]);
ipr.ibyte.bit0 = ip1.ibyte.bit5;
ip[2] = ipr.getAbyte();
ip1.setAbyte(rin[3]);
ipr.ibyte.bit7 = ip1.ibyte.bit6;
ip1.setAbyte(lin[3]);
ipr.ibyte.bit6 = ip1.ibyte.bit6;
ip1.setAbyte(rin[2]);
ipr.ibyte.bit5 = ip1.ibyte.bit6;
ip1.setAbyte(lin[2]);
ipr.ibyte.bit4 = ip1.ibyte.bit6;
ip1.setAbyte(rin[1]);
ipr.ibyte.bit3 = ip1.ibyte.bit6;
ip1.setAbyte(lin[1]);
ipr.ibyte.bit2 = ip1.ibyte.bit6;
ip1.setAbyte(rin[0]);
ipr.ibyte.bit1 = ip1.ibyte.bit6;
ip1.setAbyte(lin[0]);
ipr.ibyte.bit0 = ip1.ibyte.bit6;
ip[1] = ipr.getAbyte();
ip1.setAbyte(rin[3]);
ipr.ibyte.bit7 = ip1.ibyte.bit7;
ip1.setAbyte(lin[3]);
ipr.ibyte.bit6 = ip1.ibyte.bit7;
ip1.setAbyte(rin[2]);
ipr.ibyte.bit5 = ip1.ibyte.bit7;
ip1.setAbyte(lin[2]);
ipr.ibyte.bit4 = ip1.ibyte.bit7;
ip1.setAbyte(rin[1]);
ipr.ibyte.bit3 = ip1.ibyte.bit7;
ip1.setAbyte(lin[1]);
ipr.ibyte.bit2 = ip1.ibyte.bit7;
ip1.setAbyte(rin[0]);
ipr.ibyte.bit1 = ip1.ibyte.bit7;
ip1.setAbyte(lin[0]);
ipr.ibyte.bit0 = ip1.ibyte.bit7;
ip[0] = ipr.getAbyte();
m[7] = ip[7];
m[6] = ip[6];
m[5] = ip[5];
m[4] = ip[4];
m[3] = ip[3];
m[2] = ip[2];
m[1] = ip[1];
m[0] = ip[0];
}
public static final int MAX_CI_LEN = 1024;
}