求大神把下面C++代码转换成JAVA! 感谢感谢!

十八岁少年想打职业 2019-11-07 05:27:29

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>

/**
* 基本的8bytes数据块解密
* param unsigned long v[2] 8bytes data
* param const unsigned long k[4 16bytes key
* return unsigned long v[2] 8bytes data
* unsigned long rounds 加密轮数可选16或32
*/
void inner_decrypt(unsigned int v[2], const unsigned int k[4], unsigned int rounds) {
register unsigned int
y = v[0], z = v[1], delta = 0x9E3779B9,
a = k[0], b = k[1], c = k[2], d = k[3], sum;
if (rounds == 32)
sum = 0xc6ef3720;
else if (rounds == 16)
sum = 0xe3779b90;
else return;
while (rounds-- > 0) {
z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
sum -= delta;
}
v[0] = y;
v[1] = z;
}

/**remove the flagwords from the content
* char* flag content contains flag
* int len: length of the content
*/
char *unflag(const char *flag, int len)
{
char *unflag = (char*)malloc(len - 8);
memcpy(unflag, flag + 8, len - 9);
free((void*)flag);
return unflag;
}

/**recover hex to byte(char*)
*hex: hexString
*out:to stores the result
*/
void hex2byte(char* hex, char out[]) {
int i = 0;
int j = 0;
int temps = 0;
int temps1 = 0;

for (; i < strlen(hex) / 2; i++, j += 2) {
if (hex[j]<'0' || hex[j]>'9') {
switch (hex[j]) {
case 'A': temps = 10; break;
case 'B': temps = 11; break;
case 'C': temps = 12; break;
case 'D': temps = 13; break;
case 'E': temps = 14; break;
case 'F': temps = 15; break;
}
}
else temps = hex[j] - '0';

if (hex[j + 1]<'0' || hex[j + 1]>'9') {
switch (hex[j + 1]) {
case 'A': temps1 = 10; break;
case 'B': temps1 = 11; break;
case 'C': temps1 = 12; break;
case 'D': temps1 = 13; break;
case 'E': temps1 = 14; break;
case 'F': temps1 = 15; break;
}
}
else temps1 = hex[j + 1] - '0';
out[i] = (char)((temps & 0x0000000f) << 4) | (temps1 & 0x0000000f);
}

}

/**密钥设定函数 选取16位byte型作为前8byte加密密钥 从原始字符串中第n位开始取8byte 若不满8byte 补零 之后8byte补位 为127-n-i
* @param key 原始输入的密钥字符串
* @return 返回加解密密钥
*/
void validateKey(const char* key, unsigned int k[4]) {
int n = 6;
char tempkey[17];

if (strlen(key) - n + 1 < 8) {
int i, j;
for (i = n - 1, j = 0; i < strlen(key); i++, j++)
{
tempkey[j] = key[i];
}
for (; j < 8; j++)
tempkey[j] = 0;
for (; j < 16; j++)
tempkey[j] = 127 - n - j;

k[0] = ((tempkey[0] & 0x000000FF) << 24) |
((tempkey[1] & 0x000000FF) << 16) |
((tempkey[2] & 0x000000FF) << 8) |
(tempkey[3] & 0x000000FF);
k[1] = ((tempkey[4] & 0x000000FF) << 24) |
((tempkey[5] & 0x000000FF) << 16) |
((tempkey[6] & 0x000000FF) << 8) |
(tempkey[7] & 0x000000FF);
k[2] = ((tempkey[8] & 0x000000FF) << 24) |
((tempkey[9] & 0x000000FF) << 16) |
((tempkey[10] & 0x000000FF) << 8) |
(tempkey[11] & 0x000000FF);
k[3] = ((tempkey[12] & 0x000000FF) << 24) |
((tempkey[13] & 0x000000FF) << 16) |
((tempkey[14] & 0x000000FF) << 8) |
(tempkey[15] & 0x000000FF);

}
else {
int i, j;
for (i = n - 1, j = 0; i < n + 8; i++, j++)
tempkey[j] = key[i];
for (j = 8; j < 16; j++)
tempkey[j] = 127 - n - j;
k[0] = ((tempkey[0] & 0x000000FF) << 24) |
((tempkey[1] & 0x000000FF) << 16) |
((tempkey[2] & 0x000000FF) << 8) |
(tempkey[3] & 0x000000FF);
k[1] = ((tempkey[4] & 0x000000FF) << 24) |
((tempkey[5] & 0x000000FF) << 16) |
((tempkey[6] & 0x000000FF) << 8) |
(tempkey[7] & 0x000000FF);
k[2] = ((tempkey[8] & 0x000000FF) << 24) |
((tempkey[9] & 0x000000FF) << 16) |
((tempkey[10] & 0x000000FF) << 8) |
(tempkey[11] & 0x000000FF);
k[3] = ((tempkey[12] & 0x000000FF) << 24) |
((tempkey[13] & 0x000000FF) << 16) |
((tempkey[14] & 0x000000FF) << 8) |
(tempkey[15] & 0x000000FF);

}

}

/**
* 任意字节块的解密
* param const char* content 任意长度
* param const char* key 密钥
* return char* out 解密后内容字节
* unsigned long rounds 加密轮数可选16或32
*/
char* t_decrypt(const char* encrypt, const char* key, int clen, unsigned int rounds) {
char flag[9] = "}}}}}}}}";
if (!strncmp(flag, encrypt, 8)) {
//int clen= malloc_usable_size((void*)encrypt)-3;
//printf("clen:%d\n",clen);
char *content = unflag(encrypt, clen);

int csize = clen - 8;
//printf("csize:%d\n",csize);
char* out = (char*)malloc(csize);
int klen = strlen(key);
int i = 0;
//ii=0;
unsigned int v[2];
unsigned int k[4];
if (clen == 0 || klen == 0) {
free(out);//返回为空可能造成内存泄漏
free(content);
return NULL;
}

validateKey(key, k);
for (; i < csize - 1; i += 8) {
//ii=i;
v[0] = ((content[i] & 0x000000FF) << 24) | ((content[i + 1] & 0x000000FF) << 16) | ((content[i + 2] & 0x000000FF) << 8) | (content[i + 3] & 0x000000FF);
v[1] = ((content[i + 4] & 0x000000FF) << 24) | ((content[i + 5] & 0x000000FF) << 16) | ((content[i + 6] & 0x000000FF) << 8) | (content[i + 7] & 0x000000FF);
inner_decrypt(v, k, rounds);
//ii=i;
out[i] = (char)(v[0] >> 24);
out[i + 1] = (char)(v[0] >> 16);
out[i + 2] = (char)(v[0] >> 8);
out[i + 3] = (char)(v[0]);
out[i + 4] = (char)(v[1] >> 24);
out[i + 5] = (char)(v[1] >> 16);
out[i + 6] = (char)(v[1] >> 8);
out[i + 7] = (char)(v[1]);
}
out[csize - 1] = '\0';
free(content);
return out;
}
else {

return NULL;
}
}

char* tea_decry(char* encrypt, const char* key, unsigned int rounds) {
char* out = (char*)malloc((strlen(encrypt) / 2 + 1) * sizeof(char));

hex2byte(encrypt, out);

const char* out1 = out;
return t_decrypt(out1, key, strlen(encrypt) / 2 + 1, rounds);
}

int main() {
const char* key = "kycc6773317349692398554437175916";

char arr_encry[] = "7D7D7D7D7D7D7D7DAF5B24C35760D1C1AE06C31CFEBE2B3597DD2465B9509DB38120AE62E479043D3D9D67BDF7254B11CCFA94B4B01DE64995FFCFBE10A9612219D9386C5A58C3A17D579A2CE5F9EAE17479294EF6B888BBFDFA5F3E6735F82B4D37C6FB8095FEE848F7C199D587E25885D5F7E8D97016F3ACCCABBDD66664B312DFEFCC78763ED4D747EA0173A28D028CEF57163BB081E84F5D0C6197D2C0FCD256592E5597587AB42C174B97000A902AB0498710BC6F8C829F315491BAE1DAE9A0D00BB2C6659212457B8160BDB561AD186F90F84ABF09AC052EF437F64B5ABC464EA178978C61AE35864AE8AF534EA8A4CF8C1E7F1F6BF84B3111097B7893DF9D0D7E4283679FE9A0D00BB2C665927E1CEABB5849062721A06356878D8150DEA1628D199C14EA3EE69A9B6B6ED5FBB28627456A41132FC231F85A7ED3F361451ABD7BF864812B3F2AB7FF2C6163DED8B282A1D193D6C955C3504C2A530BDCF67AD32DA8824E7E0914C4BE511BA76279E86E4AA439B8BFCB3429C8B663AB24BF1EEE13183A6E8257FAC3A5344683B2FB0183B5FE76476D7CE5FC8A5189BCD43A3109329A2467534E362BEDC98C5E2CBFBAF3EB9A049EB89FE0D2FC9D7FC548911D91582903F35142979BB2217A1E5F2A85BBEC66239B7E663A5489ED34C28AE9A0D00BB2C66592D54E30D862CF6BB7E1EF3E3B72D29E187337E3351AEAC0FFBFFEA452B767BD720024CD2DD06AAB2AA3D08AD89C0900F2";
char* str_encry = arr_encry;
char* str_decy = tea_decry(str_encry, key, 32);
printf("发送报文解密:%s\n", str_decy);

free(str_decy);

getchar();
return 0;
}
...全文
64 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
oh_Maxy 版主 2019-11-07
  • 打赏
  • 举报
回复

import java.util.Arrays;

public class EncodeDecode {

/**
* 基本的8bytes数据块解密
* param unsigned long v[2] 8bytes data
* param const unsigned long k[4 16bytes key
* return unsigned long v[2] 8bytes data
* unsigned long rounds 加密轮数可选16或32
*/
static void innerDecrypt(long v[], long k[], long rounds) {
long
y = v[0], z = v[1], delta = 0x9E3779B9,
a = k[0], b = k[1], c = k[2], d = k[3], sum;
if (rounds == 32)
sum = 0xc6ef3720;
else if (rounds == 16)
sum = 0xe3779b90;
else
return;
while (rounds-- > 0) {
z -= ((y << 4) + c) ^ (y + sum) ^ ((y >> 5) + d);
y -= ((z << 4) + a) ^ (z + sum) ^ ((z >> 5) + b);
sum -= delta;
}
v[0] = y;
v[1] = z;
}

/**
* remove the flagwords from the content
* char* flag content contains flag
* int len: length of the content
*/
static char[] unflag(char[] flag, int len) {
return Arrays.copyOfRange(flag, 1, len - 1);
}

/**
* recover hex to byte(char*)
* hex: hexString
* out:to stores the result
*/
static void hex2byte(char hex[], char out[]) {
int i = 0;
int j = 0;
int temps = 0;
int temps1 = 0;

for (; i < hex.length / 2; i++, j += 2) {
if (hex[j] < '0' || hex[j] > '9') {
switch (hex[j]) {
case 'A':
temps = 10;
break;
case 'B':
temps = 11;
break;
case 'C':
temps = 12;
break;
case 'D':
temps = 13;
break;
case 'E':
temps = 14;
break;
case 'F':
temps = 15;
break;
}
} else
temps = hex[j] - '0';

if (hex[j + 1] < '0' || hex[j + 1] > '9') {
switch (hex[j + 1]) {
case 'A':
temps1 = 10;
break;
case 'B':
temps1 = 11;
break;
case 'C':
temps1 = 12;
break;
case 'D':
temps1 = 13;
break;
case 'E':
temps1 = 14;
break;
case 'F':
temps1 = 15;
break;
}
} else
temps1 = hex[j + 1] - '0';
out[i] = (char) (((temps & 0x0000000f) << 4) | (temps1 & 0x0000000f));
}

}

/**
* 密钥设定函数 选取16位byte型作为前8byte加密密钥 从原始字符串中第n位开始取8byte 若不满8byte 补零 之后8byte补位 为127-n-i
*
* @param key 原始输入的密钥字符串
* @return 返回加解密密钥
*/
static void validateKey(char[] key, long k[]) {
int n = 6;
char[] tempkey = new char[17];

if (key.length - n + 1 < 8) {
int i, j;
for (i = n - 1, j = 0; i < key.length; i++, j++) {
tempkey[j] = key[i];
}
for (; j < 8; j++)
tempkey[j] = 0;
for (; j < 16; j++)
tempkey[j] = (char) (127 - n - j);

k[0] = ((tempkey[0] & 0x000000FF) << 24) |
((tempkey[1] & 0x000000FF) << 16) |
((tempkey[2] & 0x000000FF) << 8) |
(tempkey[3] & 0x000000FF);
k[1] = ((tempkey[4] & 0x000000FF) << 24) |
((tempkey[5] & 0x000000FF) << 16) |
((tempkey[6] & 0x000000FF) << 8) |
(tempkey[7] & 0x000000FF);
k[2] = ((tempkey[8] & 0x000000FF) << 24) |
((tempkey[9] & 0x000000FF) << 16) |
((tempkey[10] & 0x000000FF) << 8) |
(tempkey[11] & 0x000000FF);
k[3] = ((tempkey[12] & 0x000000FF) << 24) |
((tempkey[13] & 0x000000FF) << 16) |
((tempkey[14] & 0x000000FF) << 8) |
(tempkey[15] & 0x000000FF);

} else {
int i, j;
for (i = n - 1, j = 0; i < n + 8; i++, j++)
tempkey[j] = key[i];
for (j = 8; j < 16; j++)
tempkey[j] = (char) (127 - n - j);
k[0] = ((tempkey[0] & 0x000000FF) << 24) |
((tempkey[1] & 0x000000FF) << 16) |
((tempkey[2] & 0x000000FF) << 8) |
(tempkey[3] & 0x000000FF);
k[1] = ((tempkey[4] & 0x000000FF) << 24) |
((tempkey[5] & 0x000000FF) << 16) |
((tempkey[6] & 0x000000FF) << 8) |
(tempkey[7] & 0x000000FF);
k[2] = ((tempkey[8] & 0x000000FF) << 24) |
((tempkey[9] & 0x000000FF) << 16) |
((tempkey[10] & 0x000000FF) << 8) |
(tempkey[11] & 0x000000FF);
k[3] = ((tempkey[12] & 0x000000FF) << 24) |
((tempkey[13] & 0x000000FF) << 16) |
((tempkey[14] & 0x000000FF) << 8) |
(tempkey[15] & 0x000000FF);

}

}

/**
* 任意字节块的解密
* param const char* content 任意长度
* param const char* key 密钥
* return char* out 解密后内容字节
* unsigned long rounds 加密轮数可选16或32
*/
static char[] tDecrypt(char[] encrypt, char[] key, int clen, long rounds) {
String flag = "}}}}}}}}";
if (encrypt.length != 8 || !String.valueOf(encrypt).equals(flag)) {
//int clen= malloc_usable_size((void*)encrypt)-3;
//printf("clen:%d\n",clen);
char[] content = unflag(encrypt, clen);

int csize = clen - 8;
//printf("csize:%d\n",csize);
char[] out = new char[clen - 1];
int klen = key.length;
int i = 0;
//ii=0;
long[] v = new long[2];
long[] k = new long[4];

validateKey(key, k);
for (; i < csize - 1; i += 8) {
//ii=i;
v[0] = ((content[i] & 0x000000FF) << 24) | ((content[i + 1] & 0x000000FF) << 16) | (
(content[i + 2] & 0x000000FF) << 8) | (content[i + 3] & 0x000000FF);
v[1] = ((content[i + 4] & 0x000000FF) << 24) | ((content[i + 5] & 0x000000FF) << 16) | (
(content[i + 6] & 0x000000FF) << 8) | (content[i + 7] & 0x000000FF);
innerDecrypt(v, k, rounds);
//ii=i;
out[i] = (char) (v[0] >> 24);
out[i + 1] = (char) (v[0] >> 16);
out[i + 2] = (char) (v[0] >> 8);
out[i + 3] = (char) (v[0]);
out[i + 4] = (char) (v[1] >> 24);
out[i + 5] = (char) (v[1] >> 16);
out[i + 6] = (char) (v[1] >> 8);
out[i + 7] = (char) (v[1]);
}
out[csize - 1] = '\0';
return out;
} else {

return null;
}
}

static char[] teaDecry(char[] encrypt, char[] key, long rounds) {
char[] out = new char[encrypt.length / 2 + 1];

hex2byte(encrypt, out);

char[] out1 = out;
return tDecrypt(out1, key, encrypt.length / 2 + 1, rounds);
}

public static void main(String[] args) {
char[] key = "kycc6773317349692398554437175916".toCharArray();

char arr_encry[] = "7D7D7D7D7D7D7D7DAF5B24C35760D1C1AE06C31CFEBE2B3597DD2465B9509DB38120AE62E479043D3D9D67BDF7254B11CCFA94B4B01DE64995FFCFBE10A9612219D9386C5A58C3A17D579A2CE5F9EAE17479294EF6B888BBFDFA5F3E6735F82B4D37C6FB8095FEE848F7C199D587E25885D5F7E8D97016F3ACCCABBDD66664B312DFEFCC78763ED4D747EA0173A28D028CEF57163BB081E84F5D0C6197D2C0FCD256592E5597587AB42C174B97000A902AB0498710BC6F8C829F315491BAE1DAE9A0D00BB2C6659212457B8160BDB561AD186F90F84ABF09AC052EF437F64B5ABC464EA178978C61AE35864AE8AF534EA8A4CF8C1E7F1F6BF84B3111097B7893DF9D0D7E4283679FE9A0D00BB2C665927E1CEABB5849062721A06356878D8150DEA1628D199C14EA3EE69A9B6B6ED5FBB28627456A41132FC231F85A7ED3F361451ABD7BF864812B3F2AB7FF2C6163DED8B282A1D193D6C955C3504C2A530BDCF67AD32DA8824E7E0914C4BE511BA76279E86E4AA439B8BFCB3429C8B663AB24BF1EEE13183A6E8257FAC3A5344683B2FB0183B5FE76476D7CE5FC8A5189BCD43A3109329A2467534E362BEDC98C5E2CBFBAF3EB9A049EB89FE0D2FC9D7FC548911D91582903F35142979BB2217A1E5F2A85BBEC66239B7E663A5489ED34C28AE9A0D00BB2C66592D54E30D862CF6BB7E1EF3E3B72D29E187337E3351AEAC0FFBFFEA452B767BD720024CD2DD06AAB2AA3D08AD89C0900F2"
.toCharArray();
char[] str_encry = arr_encry;
char[] str_decy = teaDecry(str_encry, key, 32);
System.out.println("发送报文解密:" + String.valueOf(str_decy));

//getchar();
}
}


再调调吧。。

50,528

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧