class HC128
{
{
String iv_srt
= "@#$$54214AEFDCAE"; String key_srt
= "AAAAAAAAqweAAAAT"; HC128 hc_enc = new HC128(iv_srt.getBytes(), key_srt.getBytes());
byte[] ed = encrypt(hc_enc, s.getBytes());
hc_enc.reset();
byte[] ed33 = encrypt(hc_enc, ed);
}
public static byte[] encrypt(HC128 hc, byte[] data) {
for (int i = 0; i < data.length; i++) {
data[i] = hc.returnByte(data[i]);
}
return data;
}
private static int f1(int x) {
return Integer.
rotateRight(x,
7) ^ Integer.
rotateRight(x,
18) ^ (x
>>> 3); }
private static int f2(int x) {
return Integer.
rotateRight(x,
17) ^ Integer.
rotateRight(x,
19) ^ (x
>>> 10); }
private int g1(int x, int y, int z) {
}
private int g2(int x, int y, int z) {
}
private int h1(int x) {
return q[x & 0xFF] + q[((x >> 16) & 0xFF) + 256];
}
private int h2(int x) {
return p[x & 0xFF] + p[((x >> 16) & 0xFF) + 256];
}
private static int mod1024(int x) {
return x & 0x3FF;
}
private static int mod512(int x) {
return x & 0x1FF;
}
private static int dim(int x, int y) {
return mod512(x - y);
}
private int step() {
int j = mod512(cnt);
int ret;
if (cnt < 512) {
p[j] += g1(p[dim(j, 3)], p[dim(j, 10)], p[dim(j, 511)]);
ret = h1(p[dim(j, 12)]) ^ p[j];
} else {
q[j] += g2(q[dim(j, 3)], q[dim(j, 10)], q[dim(j, 511)]);
ret = h2(q[dim(j, 12)]) ^ q[j];
}
cnt = mod1024(cnt + 1);
return ret;
}
private byte[] key, iv;
private int[] p = new int[512];
private int[] q = new int[512];
private int cnt = 0;
private byte[] buf = new byte[4];
private int idx = 0;
public int getCnt() {
return cnt;
}
public int getIdx() {
return idx;
}
public void setIdx(int idx) {
this.idx = idx;
}
public void setCnt(int cnt) {
this.cnt = cnt;
}
public HC128(byte[] iv, byte[] key) {
this.iv = iv;
this.key = key;
init();
}
private void init() {
if (key.length != 16) {
"The key must be 128 bit long");
}
cnt = 0;
int[] w = new int[1280];
for (int i = 0; i < 16; i++) {
w[i >> 3] |= key[i] << (i & 0x7);
}
System.
arraycopy(w,
0, w,
4,
4);
for (int i
= 0; i
< Math.
min(16, iv.
length); i
++) { w[(i >> 3) + 8] |= iv[i] << (i & 0x7);
}
System.
arraycopy(w,
8, w,
12,
4);
for (int i = 16; i < 1280; i++) {
w[i] = f2(w[i - 2]) + w[i - 7] + f1(w[i - 15]) + w[i - 16] + i;
}
System.
arraycopy(w,
256, p,
0,
512); System.
arraycopy(w,
768, q,
0,
512);
for (int i = 0; i < 512; i++) {
p[i] = step();
}
for (int i = 0; i < 512; i++) {
q[i] = step();
}
cnt = 0;
}
private byte getByte() {
if (idx == 0) {
int step = step();
buf[3] = (byte) (step & 0xFF);
step >>= 8;
buf[2] = (byte) (step & 0xFF);
step >>= 8;
buf[1] = (byte) (step & 0xFF);
step >>= 8;
buf[0] = (byte) (step & 0xFF);
}
byte ret = buf[idx];
idx = idx + 1 & 0x3;
return ret;
}
public void reset() {
idx = 0;
init();
}
public byte returnByte(byte in) {
return (byte) (in ^ getByte());
}
}
Y2xhc3MgSEMxMjgKewoJcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uCgl7CgkJU3RyaW5nIGl2X3NydCA9ICJAIyQkNTQyMTRBRUZEQ0FFIjsKICAgICAgICBTdHJpbmcga2V5X3NydCA9ICJBQUFBQUFBQXF3ZUFBQUFUIjsKCQkgSEMxMjggaGNfZW5jID0gbmV3IEhDMTI4KGl2X3NydC5nZXRCeXRlcygpLCBrZXlfc3J0LmdldEJ5dGVzKCkpOwoKICAgICAgICBTdHJpbmcgcyA9ICJIZWxsbyBXb3JsZCI7CiAgICAgIAogICAgICAgIGJ5dGVbXSBlZCA9IGVuY3J5cHQoaGNfZW5jLCBzLmdldEJ5dGVzKCkpOwogICAgICAgIAogICAgICAgIGhjX2VuYy5yZXNldCgpOwoKICAgICAgICBieXRlW10gZWQzMyA9IGVuY3J5cHQoaGNfZW5jLCBlZCk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG5ldyBTdHJpbmcoZWQzMykpOwoJfQoJCglwdWJsaWMgc3RhdGljIGJ5dGVbXSBlbmNyeXB0KEhDMTI4IGhjLCBieXRlW10gZGF0YSkgewoKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgZGF0YVtpXSA9IGhjLnJldHVybkJ5dGUoZGF0YVtpXSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBkYXRhOwogICAgfQogICAgCglwcml2YXRlIHN0YXRpYyBpbnQgZjEoaW50IHgpIHsKICAgICAgICByZXR1cm4gSW50ZWdlci5yb3RhdGVSaWdodCh4LCA3KSBeIEludGVnZXIucm90YXRlUmlnaHQoeCwgMTgpIF4gKHggPj4+IDMpOwogICAgfQoKICAgIHByaXZhdGUgc3RhdGljIGludCBmMihpbnQgeCkgewogICAgICAgIHJldHVybiBJbnRlZ2VyLnJvdGF0ZVJpZ2h0KHgsIDE3KSBeIEludGVnZXIucm90YXRlUmlnaHQoeCwgMTkpIF4gKHggPj4+IDEwKTsKICAgIH0KCiAgICBwcml2YXRlIGludCBnMShpbnQgeCwgaW50IHksIGludCB6KSB7CiAgICAgICAgcmV0dXJuIChJbnRlZ2VyLnJvdGF0ZVJpZ2h0KHgsIDEwKSBeIEludGVnZXIucm90YXRlUmlnaHQoeiwgMjMpKQogICAgICAgICAgICAgICAgKyBJbnRlZ2VyLnJvdGF0ZVJpZ2h0KHksIDgpOwogICAgfQoKICAgIHByaXZhdGUgaW50IGcyKGludCB4LCBpbnQgeSwgaW50IHopIHsKICAgICAgICByZXR1cm4gKEludGVnZXIucm90YXRlTGVmdCh4LCAxMCkgXiBJbnRlZ2VyLnJvdGF0ZUxlZnQoeiwgMjMpKQogICAgICAgICAgICAgICAgKyBJbnRlZ2VyLnJvdGF0ZUxlZnQoeSwgOCk7CiAgICB9CgogICAgcHJpdmF0ZSBpbnQgaDEoaW50IHgpIHsKICAgICAgICByZXR1cm4gcVt4ICYgMHhGRl0gKyBxWygoeCA+PiAxNikgJiAweEZGKSArIDI1Nl07CiAgICB9CgogICAgcHJpdmF0ZSBpbnQgaDIoaW50IHgpIHsKICAgICAgICByZXR1cm4gcFt4ICYgMHhGRl0gKyBwWygoeCA+PiAxNikgJiAweEZGKSArIDI1Nl07CiAgICB9CgogICAgcHJpdmF0ZSBzdGF0aWMgaW50IG1vZDEwMjQoaW50IHgpIHsKICAgICAgICByZXR1cm4geCAmIDB4M0ZGOwogICAgfQoKICAgIHByaXZhdGUgc3RhdGljIGludCBtb2Q1MTIoaW50IHgpIHsKICAgICAgICByZXR1cm4geCAmIDB4MUZGOwogICAgfQoKICAgIHByaXZhdGUgc3RhdGljIGludCBkaW0oaW50IHgsIGludCB5KSB7CiAgICAgICAgcmV0dXJuIG1vZDUxMih4IC0geSk7CiAgICB9CgogICAgcHJpdmF0ZSBpbnQgc3RlcCgpIHsKICAgICAgICBpbnQgaiA9IG1vZDUxMihjbnQpOwogICAgICAgIGludCByZXQ7CiAgICAgICAgaWYgKGNudCA8IDUxMikgewogICAgICAgICAgICBwW2pdICs9IGcxKHBbZGltKGosIDMpXSwgcFtkaW0oaiwgMTApXSwgcFtkaW0oaiwgNTExKV0pOwogICAgICAgICAgICByZXQgPSBoMShwW2RpbShqLCAxMildKSBeIHBbal07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcVtqXSArPSBnMihxW2RpbShqLCAzKV0sIHFbZGltKGosIDEwKV0sIHFbZGltKGosIDUxMSldKTsKICAgICAgICAgICAgcmV0ID0gaDIocVtkaW0oaiwgMTIpXSkgXiBxW2pdOwogICAgICAgIH0KICAgICAgICBjbnQgPSBtb2QxMDI0KGNudCArIDEpOwogICAgICAgCiAgICAgICAgcmV0dXJuIHJldDsKICAgIH0KICAgIAogICAgcHJpdmF0ZSBieXRlW10ga2V5LCBpdjsKICAgIHByaXZhdGUgaW50W10gcCA9IG5ldyBpbnRbNTEyXTsKICAgIHByaXZhdGUgaW50W10gcSA9IG5ldyBpbnRbNTEyXTsKICAgIHByaXZhdGUgaW50IGNudCA9IDA7CiAgICBwcml2YXRlIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVs0XTsKICAgIHByaXZhdGUgaW50IGlkeCA9IDA7CgogICAgcHVibGljIGludCBnZXRDbnQoKSB7CiAgICAgICAgcmV0dXJuIGNudDsKICAgIH0KCiAgICBwdWJsaWMgaW50IGdldElkeCgpIHsKICAgICAgICByZXR1cm4gaWR4OwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHNldElkeChpbnQgaWR4KSB7CiAgICAgICAgdGhpcy5pZHggPSBpZHg7CiAgICB9CgogICAgcHVibGljIHZvaWQgc2V0Q250KGludCBjbnQpIHsKICAgICAgICB0aGlzLmNudCA9IGNudDsKICAgIH0KCiAgICBwdWJsaWMgSEMxMjgoYnl0ZVtdIGl2LCBieXRlW10ga2V5KSB7CiAgICAgICAgdGhpcy5pdiA9IGl2OwogICAgICAgIHRoaXMua2V5ID0ga2V5OwogICAgICAgIGluaXQoKTsKICAgIH0KCiAgICBwcml2YXRlIHZvaWQgaW5pdCgpIHsKICAgICAgICBpZiAoa2V5Lmxlbmd0aCAhPSAxNikgewogICAgICAgICAgICB0aHJvdyBuZXcgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKICAgICAgICAgICAgICAgICAgICAiVGhlIGtleSBtdXN0IGJlIDEyOCBiaXQgbG9uZyIpOwogICAgICAgIH0KICAgICAgICBjbnQgPSAwOwogICAgICAgIGludFtdIHcgPSBuZXcgaW50WzEyODBdOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykgewogICAgICAgICAgICB3W2kgPj4gM10gfD0ga2V5W2ldIDw8IChpICYgMHg3KTsKICAgICAgICB9CiAgICAgICAgU3lzdGVtLmFycmF5Y29weSh3LCAwLCB3LCA0LCA0KTsKCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNYXRoLm1pbigxNiwgaXYubGVuZ3RoKTsgaSsrKSB7CiAgICAgICAgICAgIHdbKGkgPj4gMykgKyA4XSB8PSBpdltpXSA8PCAoaSAmIDB4Nyk7CiAgICAgICAgfQogICAgICAgIFN5c3RlbS5hcnJheWNvcHkodywgOCwgdywgMTIsIDQpOwoKICAgICAgICBmb3IgKGludCBpID0gMTY7IGkgPCAxMjgwOyBpKyspIHsKICAgICAgICAgICAgd1tpXSA9IGYyKHdbaSAtIDJdKSArIHdbaSAtIDddICsgZjEod1tpIC0gMTVdKSArIHdbaSAtIDE2XSArIGk7CiAgICAgICAgfQoKICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHcsIDI1NiwgcCwgMCwgNTEyKTsKICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHcsIDc2OCwgcSwgMCwgNTEyKTsKCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1MTI7IGkrKykgewogICAgICAgICAgICBwW2ldID0gc3RlcCgpOwogICAgICAgIH0KICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDUxMjsgaSsrKSB7CiAgICAgICAgICAgIHFbaV0gPSBzdGVwKCk7CiAgICAgICAgfQoKICAgICAgICBjbnQgPSAwOwogICAgfQoKICAgIHByaXZhdGUgYnl0ZSBnZXRCeXRlKCkgewogICAgICAgIGlmIChpZHggPT0gMCkgewogICAgICAgICAgICBpbnQgc3RlcCA9IHN0ZXAoKTsKICAgICAgICAgICAgYnVmWzNdID0gKGJ5dGUpIChzdGVwICYgMHhGRik7CiAgICAgICAgICAgIHN0ZXAgPj49IDg7CiAgICAgICAgICAgIGJ1ZlsyXSA9IChieXRlKSAoc3RlcCAmIDB4RkYpOwogICAgICAgICAgICBzdGVwID4+PSA4OwogICAgICAgICAgICBidWZbMV0gPSAoYnl0ZSkgKHN0ZXAgJiAweEZGKTsKICAgICAgICAgICAgc3RlcCA+Pj0gODsKICAgICAgICAgICAgYnVmWzBdID0gKGJ5dGUpIChzdGVwICYgMHhGRik7CiAgICAgICAgfQogICAgICAgIGJ5dGUgcmV0ID0gYnVmW2lkeF07CiAgICAgICAgaWR4ID0gaWR4ICsgMSAmIDB4MzsKICAgICAgICByZXR1cm4gcmV0OwogICAgfQoKICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgewogICAgICAgIGlkeCA9IDA7CiAgICAgICAgaW5pdCgpOwogICAgfQoKICAgIHB1YmxpYyBieXRlIHJldHVybkJ5dGUoYnl0ZSBpbikgewogICAgICAgIHJldHVybiAoYnl0ZSkgKGluIF4gZ2V0Qnl0ZSgpKTsKICAgIH0KfQ==