我在BlackBerry JDE 5.0.0上开发了一个应用程序,它使用带有ECB模式的DES算法对String进行加密。加密后,结果由base64编码编码。但每当我将我从加密方法得到的结果与我在在线加密器引擎上获得的结果进行比较时,它总会在最后几个字符上给出不同的结果。我试图解密我使用在线encriptor引擎形成我的加密方法的结果,看起来结果不是有效的。那么如何在最后几个字符上修复不同的结果呢?
这是我的加密方法代码:
public String encryptDESECB(String text) throws MessageTooLongException
{
byte[] input = text.getBytes();
byte[] output = new byte[8];
byte[] uid = null;
uid = "431654625bd37673e3b00359676154074a04666a".getBytes();
DESKey key = new DESKey(uid);
try {
DESEncryptorEngine engine = new DESEncryptorEngine(key);
engine.encrypt(input, 0, output, 0);
String x= BasicAuth.encode(new String(output));
System.out.println("AFTER ENCODE"+x);
return new String(x);
} catch (CryptoTokenException e) {
return "NULL";
} catch (CryptoUnsupportedOperationException e) {
return "NULL";
}
}
我要加密的字符串是“00123456” 我从加密方法得到的结果是:YnF2BWFV / 8w = 我从在线加密器引擎(http://www.tools4noobs.com/online_tools/encrypt/)得到的结果:YnF2BWFV9sw = 我从android获得的结果(使用相同的加密算法和方法):YnF2BWFV9sw =
以下是Android上的代码:
public static String encryptDesECB(String data) {
try {
DESKeySpec keySpec = newDESKeySpec("431654625bd37673e3b00359676154074a04666a".getBytes("UTF8"));
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey key = keyFactory.generateSecret(keySpec);
// ENCODE plainTextPassword String
byte[] cleartext = data.getBytes("UTF8");
Cipher cipher = Cipher.getInstance("DES/ECB/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, key);
Logger.log(Log.INFO, new String(cipher.doFinal(cleartext)));
String encrypedPwd = Base64.encodeToString(cipher.doFinal(cleartext), Base64.DEFAULT);
Logger.log(Log.INFO, encrypedPwd);
return encrypedPwd;
} catch (Exception e) {
Logger.log(e);
return null;
}
}
任何人都可以帮我吗?
答案 0 :(得分:0)
这很可能是由填充引起的,因为DES适用于8字节块。
有关详细信息,请查看此链接:
http://www.tero.co.uk/des/explain.php#Padding
只要您能正确解密内容,您就可以了。
答案 1 :(得分:0)
我发现了自己的错误。事实证明,我的BasicAuth类不是编码加密字符串的正确类。现在我正在使用正确的一个Base64类进行编码,结果很好。