分享一个加密算法(100分散分)
最近公司购买一套系统 (JAVA+spring),里面有一个加密算法,这个算法只提供了加密,没有提供解密,代码里有个解密的,可是我研究了好久,始终解密不了,哪位高手能帮我解密一下????比喻密码是:ABC123,把它加密后按下面方法可以解密成 :169FD48721EA70C7
Encryption encryption = new Encryption("ABC123");
System.out.println(encryption.encryptString("ABC123", true)) ;
输出为:169FD48721EA70C7
也就是说:169FD48721EA70C7解密成多少呢?
Encryption encryption = new Encryption("");
System.out.println(encryption.encryptString("169FD48721EA70C7", true)) ;
输出为: (y(0i? 应该为ABC123才对。
哪位高手能帮我解密一下????
--------------------编程问答--------------------
package fe.encry;
import fe.util.EncrypUtil;
import java.io.File;
import java.io.FileInputStream;
import java.io.PrintStream;
public class Encryption
{
private int intPrivateKey = 0;
private static final long MaxInt = ()Math.pow(2.0D, 32.0D);
private int[] intConstKey = { 1556696929, 1266038903, 1265722019, 1265722531,
1265658509, 1265282947, 1263528397, 1263599759,
1263487033, 1263648241, 1262235517, 1262210177,
1261371079, 1261525493, 1261118363, 1260675071,
1260706169, 1260299731, 1260230359, 1259026997,
1258887283, 1258865891, 1258626371, 1258503781,
1258482227, 1258579643, 1258190971, 1258098757,
1257611279, 1257724121, 1257273319, 1257361279,
1256913187, 1256892151, 1256455111, 1256408429,
1060988843, 1028046497, 1059548141, 1059702103,
1059282011, 1057910353, 1057261279, 1056410731,
1027302959, 1056241757, 1053532217, 1053109769,
1052145631, 1052156549, 1052311109, 1052138359,
1051307749, 1051455023, 1030905121, 1030546703,
1030613851, 1030517641, 1029296581, 1029412469,
1028968387, 1028847733, 1028118731, 1028044769 };
private int[] intUserKey = new int[64];
private int[] intPosition = new int[64];
private static int encryptionInfo = 3;
private static long readTimer = 0L;
public static final long lngREMAINTIMER = 600000L;
public static final long abc = Long.parseLong("7776000000");
public Encryption(String strKey)
{
int[] intData = getStringLong(strKey);
this.intPrivateKey = 0;
if (intData != null) {
for (int i = 0; i < intData.length; i++) {
this.intPrivateKey ^= intData[i];
}
}
intData = getStringLong(String.valueOf(this.intPrivateKey));
for (int i = 0; i < intData.length; i++) {
this.intPrivateKey ^= intData[i];
}
processKeyGene();
}
public Encryption()
{
}
public int[] getStringLong(String strString)
{
byte[] byteString = strString.getBytes();
int intI = 0;
int intIndex = -1;
int intByte = 0;
if (byteString.length == 0) {
return null;
}
int[] intData = new int[(byteString.length - 1) / 4 + 1];
while (intI < byteString.length) {
if (intI % 4 == 0) {
intIndex++; intData[intIndex] = 0;
}
intByte = byteString[(intI++)];
if (intByte < 0) {
intByte += 256;
}
intData[intIndex] = ((intData[intIndex] << 8) + intByte);
}
return intData;
}
public String getLongString(int[] intData)
{
String strData = "";
if (intData != null) {
int[] intLocation = { -16777216, 16711680, 65280, 255 };
int[] intMove = { 24, 16, 8 };
int intIndex = 0; int intI = 0;
int intLen = (intData.length - 1) * 4 + 1;
int tmp = intData[(intData.length - 1)];
if (tmp < 0)
intLen += 3;
else {
while (tmp > 255) {
intLen++;
tmp >>= 8;
}
}
byte[] bytString = new byte[intLen];
intLen = 0;
while (intI < intData.length - 1) {
bytString[(intLen++)] = (byte)((intData[intI] & intLocation[intIndex]) >> intMove[intIndex]);
intIndex++; if (intIndex > 3) {
intI++;
intIndex = 0;
}
}
tmp = intData[(intData.length - 1)];
for (intI = bytString.length - 1; intI >= intLen; intI--) {
bytString[intI] = (byte)(tmp & 0xFF);
tmp >>= 8;
}
strData = new String(bytString);
}
return strData;
}
public int[] getHexLong(String strHex)
{
if (strHex.length() == 0) {
return null;
}
int[] intData = new int[(strHex.length() - 1) / 8 + 1];
String strSubHex = "";
for (int i = 0; i < strHex.length(); i += 8) {
if (i + 8 < strHex.length())
strSubHex = strHex.substring(i, i + 8);
else {
strSubHex = strHex.substring(i);
}
intData[(i / 8)] = (int)Long.parseLong(strSubHex, 16);
}
return intData;
}
public String getLongHex(int[] intData)
{
String strHex = "";
String strSubHex = "";
if (intData != null) {
for (int i = 0; i < intData.length - 1; i++) {
strSubHex = Integer.toHexString(intData[i]).toUpperCase();
for (int j = strSubHex.length(); j < 8; j++) {
strSubHex = "0" + strSubHex;
}
strHex = strHex + strSubHex;
}
strSubHex = Integer.toHexString(intData[(intData.length - 1)]).toUpperCase();
if (strSubHex.length() % 2 != 0) {
strSubHex = "0" + strSubHex;
}
strHex = strHex + strSubHex;
}
return strHex;
}
private void processKeyGene()
{
boolean[] blnInGene = new boolean[64];
int intG = 0; int intGCount = -1; int intCount = 0;
int[] intGene = new int[64];
String strPrivateKey = String.valueOf(this.intPrivateKey);
for (int i = 0; i < 64; i++) {
this.intUserKey[i] = this.intConstKey[i];
blnInGene[i] = false;
this.intPosition[i] = i;
intGene[i] = -1;
}
for (int i = 0; i < strPrivateKey.length(); i++) {
if (strPrivateKey.substring(i, i + 1).equals("-"))
intG = 0;
else {
intG = Integer.parseInt(strPrivateKey.substring(i, i + 1));
}
if (blnInGene[intG] != 0) {
continue;
}
blnInGene[intG] = true;
this.intPrivateKey = (this.intUserKey[intG] ^ this.intPrivateKey);
intGCount++;
intGene[intGCount] = intG;
}
intCount = intGCount;
for (int i = 0; i <= intCount; i++) {
if ((intGene[i] > 0) && (intGene[i] < 7)) {
for (int j = 0; j <= intCount; j++) {
intG = intGene[i] * 10 + intGene[j];
if ((intG < 64) && (blnInGene[intG] == 0)) {
intGCount++;
intGene[intGCount] = intG;
this.intPrivateKey = (this.intUserKey[intG] ^ this.intPrivateKey);
}
}
}
}
intGCount++;
for (int i = 0; i < 64; i++) {
int j = (int)(intGene[(i % intGCount)] * Math.pow(i, 2.0D)) & 0x1F;
intG = this.intUserKey[i];
this.intUserKey[i] = this.intUserKey[j];
this.intUserKey[j] = intG;
intG = this.intPosition[i];
this.intPosition[i] = this.intPosition[j];
this.intPosition[j] = intG;
}
}
--------------------编程问答-------------------- 是用什么算法加密的好像不清楚,仅凭加密代码去解密的话还是有点难度哦. --------------------编程问答-------------------- 明显里面已经提供了解密函数:decryptionString()
public String encryptString(String strString, boolean blnGetHex)
{
if (EncrypUtil.isFingerprint(strString)) {
return EncrypUtil.getFingerValue(strString);
}
if (blnGetHex) {
return getLongHex(encryptData(getStringLong(strString), true));
}
return getLongString(encryptData(getStringLong(strString), true));
}
public String encryptString(String strString)
{
return getLongString(encryptData(getStringLong(strString), true));
}
public String decryptionString(String strString, boolean blnIsHex)
{
if (blnIsHex) {
return getLongString(encryptData(getHexLong(strString), false));
}
return getLongString(encryptData(getStringLong(strString), false));
}
public String decryptionString(String strString)
{
return getLongString(encryptData(getStringLong(strString), false));
}
public int[] encryptData(int[] intData, boolean blnEncryption)
{
if (intData == null) {
return null;
}
int intLen = intData.length;
int[] intEncryptData = new int[intLen];
int[] intModPosition = (int[])null;
int intMod = intLen & 0x3F;
if (intMod > 0) {
intModPosition = new int[intMod];
int index = -1;
for (int i = 0; i < 64; i++) {
if (this.intPosition[i] < intMod) {
index++; intModPosition[index] = this.intPosition[i];
}
}
}
if (blnEncryption) {
for (int i = 0; i < intLen; i++)
if (intLen - i > 63) {
for (int j = 0; j < 64; j++) {
intEncryptData[(i + j)] = (intData[(i + this.intPosition[j])] ^ this.intPrivateKey ^ this.intUserKey[j]);
}
i += 63;
} else {
for (int j = 0; j < intLen - i; j++) {
intEncryptData[(i + j)] = (intData[(i + intModPosition[j])] ^ this.intPrivateKey ^ this.intUserKey[j]);
}
i = intLen;
}
}
else {
for (int i = 0; i < intData.length; i++) {
if (intLen - i > 63) {
for (int j = 0; j < 64; j++) {
intEncryptData[(i + this.intPosition[j])] = (intData[(i + j)] ^ this.intPrivateKey ^ this.intUserKey[j]);
}
i += 63;
} else {
for (int j = 0; j < intLen - i; j++) {
intEncryptData[(i + intModPosition[j])] = (intData[(i + j)] ^ this.intPrivateKey ^ this.intUserKey[j]);
}
i = intLen;
}
}
}
return intEncryptData;
}
public static int getEncryptionMachineInfo()
{
return encryptionInfo;
}
public byte[] decryptionFile(String strFileName)
{
byte[] bytData = (byte[])null;
File file = new File(strFileName);
int fleLen = (int)file.length();
if (fleLen > 8) {
try {
FileInputStream in = new FileInputStream(file);
int srcLength = 0;
bytData = new byte[4];
for (int i = 0; i < 2; i++) {
in.read(bytData);
for (int j = 3; j >= 0; j--) {
if (bytData[j] < 0)
srcLength = (srcLength << 8) + 256 + bytData[j];
else {
srcLength = (srcLength << 8) + bytData[j];
}
}
}
fleLen -= 8;
bytData = new byte[fleLen];
in.read(bytData);
in.close();
if (fleLen % 4 == 0)
fleLen /= 4;
else {
fleLen = fleLen / 4 + 1;
}
int[] intData = new int[fleLen];
int intIndex = 0;
for (int i = 0; i < fleLen; i++) {
intIndex += 4;
for (int j = 1; j < 5; j++) {
int index = intIndex - j;
if (index < bytData.length) {
if (bytData[index] < 0)
intData[i] = ((intData[i] << 8) + 256 + bytData[index]);
else {
intData[i] = ((intData[i] << 8) + bytData[index]);
}
}
}
}
intData = encryptData(intData, false);
bytData = new byte[srcLength];
intIndex = 0;
for (int i = 0; i < fleLen; i++) {
long lngData = intData[i];
intIndex += 4;
for (int j = 4; j > 0; j--) {
int index = intIndex - j;
if (index < srcLength) {
bytData[(intIndex - j)] = (byte)(int)(lngData & 0xFF);
lngData >>= 8;
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
return bytData;
}
}
但是你调用错了,应该是:
Encryption encryption = new Encryption("IamPrivateKey"); // 私钥,加解密必须保持一致
System.out.println(encryption.encryptString("ABC123", true)) ;
输出为:xxxxxxxxxxxooooooooooo
也就是说:169FD48721EA70C7解密成多少呢?
Encryption encryption = new Encryption("IamPrivateKey"); // 私钥,加解密必须保持一致
System.out.println(encryption.decryptionString("xxxxxxxxxxxooooooooooo", true)) ;
输出就是原文了:ABC123 --------------------编程问答--------------------
1 --------------------编程问答-------------------- --------------------编程问答-------------------- 非常感谢高手的指点!
关键一点是 在加密时,系统把所输入的密码当 私钥 ,找到私钥那么密码就可以知道了,但关键是密码是不知道的!需要破解,也就是说这个密码是永远都是解不开的?
有没有哪位热心的高手帮手能从代码里找到解开的方法? --------------------编程问答-------------------- 饿 --------------------编程问答-------------------- 3楼真是高手啊!~学习学习 --------------------编程问答--------------------
可能性较高。因为对密码进行加密,一般来说都希望走不可逆模式,如果可逆这个加密就很危险了。
当然,由于你给出的这个是对称密钥加密算法,也就意味着算法本身并非不可逆,只是求解其密钥难度很高而已。所以破解的可能性还是有的,但是要找专业人士,数学领域的密码学专业人士。
CSDN的人,基本上都是偏应用研究方向,而非理论研究方向,所以你很难在这里找到有效帮助。 --------------------编程问答-------------------- 额,司也是的卖软件产品,需要对Licsense进行加密解密,我用的是经典算法DES算法 --------------------编程问答-------------------- 高手求来解答,围观中~!~!~! --------------------编程问答-------------------- 真的是散分吗? --------------------编程问答-------------------- 这样解密不了啊另寻蹊径吧源代码 都有了为什么没有密码呢? --------------------编程问答-------------------- --------------------编程问答--------------------
可能是散分吧 --------------------编程问答-------------------- 可以把三楼说的试一下,如果提供了加密算法,不提供解密也很正常,很多加密就是为了不可逆的 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答--------------------
+1 --------------------编程问答-------------------- 你不会调用吗? --------------------编程问答-------------------- (⊙o⊙)?O(∩_∩)O --------------------编程问答-------------------- 谢谢分享 --------------------编程问答-------------------- 很好,学习了!其实很讨厌加密! --------------------编程问答-------------------- --------------------编程问答-------------------- 一直觉得加解密很高深的菜鸟游走... --------------------编程问答-------------------- 菜鸟路过!!!!好给力哦!!! --------------------编程问答-------------------- fe.util.EncrypUtil 这个类没有啊 --------------------编程问答--------------------
为什么要把密码当私钥呢?如果你需要解密,那个私钥应该是另外一个常量,而且你加减密的地方都可以获得的 --------------------编程问答-------------------- 密码学中有个经典的理论:
除非你是密码学家,否则不要自以为聪明地发明密码算法! --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 谢谢分享 --------------------编程问答-------------------- 调用 decryptionString(String , boolean )
--------------------编程问答-------------------- 看了一下,明显是调用decryptionString(String , boolean)方法撒,你调用的那个方法是传入的密钥 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- img=/upload/20131228/2.gif][/img] --------------------编程问答--------------------
--------------------编程问答-------------------- 都看不懂~~ --------------------编程问答-------------------- 听说散分?? --------------------编程问答-------------------- 高手啊!~学习学习 --------------------编程问答-------------------- 很好 收藏了 --------------------编程问答-------------------- 拿分走人,都是用封装好的,没有去研究算法实质 --------------------编程问答-------------------- 对称加密 我感觉最好用AES就好了,JDK也对AES加密支持的很好 --------------------编程问答--------------------
加密分可逆和不可逆,建議采用不可逆加密,比如:MD5,這樣安全性高。 --------------------编程问答-------------------- 很明显这是个对称算法嘛。DES
加密 解密都是用一个私钥,调的方法不同而已 --------------------编程问答--------------------
MD4、MD5,SHA系列等都是哈希算法,不是真正意义上的加密算法(因为不能解密),虽然在密码学中也频繁用到。哈希算法确实是不可逆的,但是会产生碰撞。
另,密码学里加密算法设计有个要求:就是一个好的加解密算法是基于密钥的保密,而不是加密算法的保密。也就是说加密算法都是公开了的,如果是某个程序库提供的国际标准加密算法,建议非密码学或数学专业还是不要浪费时间通过算法去解密密文。
DES已经不安全了。 --------------------编程问答-------------------- 晕死 没搞清这是个怎么一回事
反正下面一段是能执行
Encryption encryption = new Encryption("123");
System.out.println(encryption.encryptString("123",true)) ;
System.out.println(encryption.decryptionString("19D25634",true)) ;
console:
19D25634
123
--------------------编程问答-------------------- 这样了
Encryption encryption = new Encryption("567");
System.out.println(encryption.encryptString("abc123",true)) ;
Encryption encryption1 = new Encryption("567");
System.out.println(encryption1.decryptionString("6D25F78F",true)) ; --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 菜鸟表示看不太懂。。。努力学习中! --------------------编程问答-------------------- fe.util.EncrypUtil 这个类没有啊 --------------------编程问答-------------------- --------------------编程问答--------------------
菜鸟表示看不太懂。。。努力学习中!
--------------------编程问答-------------------- 膜拜 菜鸟表示看不太懂。。。努力学习中! --------------------编程问答-------------------- 加密的时候如果用到的参数都不知道的话,要破解起来是很困难的,这样才能更好的保护用户信息。
你要是想破解,进数学吧。 --------------------编程问答-------------------- 又见识了一种加密的。。。 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答--------------------
应该是散分吧! --------------------编程问答--------------------
+++++++++++++++++++++++++ --------------------编程问答-------------------- 三楼看头像就应该给他分。 --------------------编程问答-------------------- 菜鸟 表示压力很大 努力学习中 --------------------编程问答-------------------- 我能说我是来领分的吗? --------------------编程问答--------------------
一定是散分吗? --------------------编程问答--------------------
肯定是散分的 --------------------编程问答-------------------- 整套代码比较复杂 --------------------编程问答-------------------- 还是老老实实的拿分吧,呵呵 --------------------编程问答-------------------- 太高深了,,路过拿分。 --------------------编程问答-------------------- --------------------编程问答-------------------- 真有分? 弱弱的问一句:分有啥用。 --------------------编程问答-------------------- public String encryptString(String strString, boolean blnGetHex)
{
if (EncrypUtil.isFingerprint(strString)) {
return EncrypUtil.getFingerValue(strString);
}
if (blnGetHex) {
return getLongHex(encryptData(getStringLong(strString), true));
}
return getLongString(encryptData(getStringLong(strString), true));
}
EncrypUtil.isFingerprint(strString)
EncrypUtil.getFingerValue(strString);
是做什么用的? --------------------编程问答-------------------- --------------------编程问答-------------------- fe.util.EncrypUtil; 你能够提供一下这个方法吗? --------------------编程问答-------------------- 一看都调用错了,加密和解密都用一个方法? --------------------编程问答-------------------- 支持! --------------------编程问答-------------------- --------------------编程问答-------------------- 表示看不懂 --------------------编程问答-------------------- --------------------编程问答-------------------- 这东西真是强大啊 --------------------编程问答-------------------- 额 还有分吗 --------------------编程问答-------------------- 听说是散分……
补充:Java , Web 开发