package COM.CCB.EnDecryptAlgorithm;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.Security;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.ShortBufferException;
import javax.crypto.spec.SecretKeySpec;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import sun.misc.BASE64Encoder;
public class MCipherEncryptor
{
private String encryptKey = "9R@e8Y3#";
static
{
if (Security.getProvider("BC") == null)
{
Security.addProvider(new BouncyCastleProvider());
}
}
public MCipherEncryptor(String key)
{
this.encryptKey = key.substring(0, 8);
}
public String getEncryptKey() {
return this.encryptKey;
}
public void setEncryptKey(String encryptKey) {
this.encryptKey = encryptKey.substring(0, 8);
}
private static byte[] wrapBytes(byte[] srcBytes, byte[] wrapKey) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, ShortBufferException, IllegalBlockSizeException, BadPaddingException, NoSuchProviderException, InvalidAlgorithmParameterException
{
SecretKeySpec key = new SecretKeySpec(wrapKey, "DES");
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding", "BC");
cipher.init(1, key);
byte[] cipherText = cipher.doFinal(srcBytes);
return cipherText;
}
public static String EncodeBase64String(byte[] srcBytes)
{
BASE64Encoder en = new BASE64Encoder();
String base64Result = en.encode(srcBytes);
return base64Result;
}
public String getEncodeString(String srcString)
throws InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, ShortBufferException, IllegalBlockSizeException, BadPaddingException, NoSuchProviderException, InvalidAlgorithmParameterException, UnsupportedEncodingException
{
byte[] cipherBytes = wrapBytes(srcString.getBytes("ISO-8859-1"), this.encryptKey.getBytes("ISO-8859-1"));
String basedString = EncodeBase64String(cipherBytes);
String resultString = basedString.replaceAll("\\+", ",");
return URLEncoder.encode(resultString, "ISO-8859-1");
}
public String doEncrypt(String srcString)
throws InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException, ShortBufferException, IllegalBlockSizeException, BadPaddingException, NoSuchProviderException, InvalidAlgorithmParameterException, UnsupportedEncodingException
{
byte[] cipherBytes = wrapBytes(srcString.getBytes("utf-16"), this.encryptKey.getBytes("ISO-8859-1"));
String basedString = EncodeBase64String(cipherBytes);
String resultString = basedString.replaceAll("\\+", ",");
return URLEncoder.encode(resultString, "iso-8859-1");
}
}
--------------------------------------------------------------------------------------------------------------------------------------------
以上是java jar反編譯des加密代碼,跪求大佬如何轉成delphi7代碼,要求兩者加密一致。。


有大佬嗎、???我轉換時遇到編碼問題了,一只解決不了。懇請大佬指點一下。。。
感激不盡、感激不盡。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
uj5u.com熱心網友回復:
頂!!!!!!uj5u.com熱心網友回復:
java的string是unicode編碼,D7的string是DBCS編碼,同樣的演算法,你使用WideString就好了。uj5u.com熱心網友回復:
Delphi本身沒有提供DES演算法標準的des演算法(ecb模式)可參考http://code1.okbase.net/codefile/DESUnit.pas_2013080823367_2.htm
被加密字符用WideString, 密碼用String(也就是AnsiString);
加密方案使用了PKCS5Padding填充模式,因此如果被加密字串的位元組數不足8倍數的話,缺1個位元組填充1個數值1,缺2個位元組填充2個數值2,其余類推。如果字串本身的位元組數剛好是8倍數,則在填充8個數值8
uj5u.com熱心網友回復:
解密的時候相應的也要相應的剔除填充上去的位元組。uj5u.com熱心網友回復:
大佬有具體實作么
uj5u.com熱心網友回復:
我現在沒有具體的實作。我提供的資訊應該夠你具體實作了。
uj5u.com熱心網友回復:
好的 我再研究研究
uj5u.com熱心網友回復:
論壇上應該有DES演算法單元下載,我的下載資源中有一個加密單元應該也是基于DES演算法的不過有致命缺點,很多DES演算法單元對中文支持不好,偶爾會出現亂碼
建議最好不要用D7實作DES,改用XE10來實作
uj5u.com熱心網友回復:
D7沒有原生支持unicode,對于這些演算法來說是致命傷uj5u.com熱心網友回復:
D7用WideString也可以,只要保證:所有串資料都用WideString,加解密都用位元組陣列轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/36027.html
標籤:語言基礎/算法/系統設計
