C#到Java DES加密

尝试创建java类,它将像下面的C#代码一样加密和解密。

下面是我的C#代码,我需要将其转换为Java。 有人可以帮我怎么做吗?

我已经这样做了将近2天但却找不到任何关于如何转换它的解决方案。 我是加密的新手。

注 – 似乎C#代码使用了ACME库。 但在我的java中,我不应该使用ACME jar文件。

public static string EncryptBase64(string key, string clearText) { if (key.Length > 8) key = key.Substring(0, 8); byte[] keyBytes = System.Text.Encoding.ASCII.GetBytes(key); byte[] clearBytes = GetClearTextBytes(clearText); // calculate the number of legitimate bytes in the last block byte lastByte = (byte)(8 - (clearBytes.Length - textEncoding.GetByteCount(clearText))); MemoryStream ms = new MemoryStream(); DES des = new DESCryptoServiceProvider(); des.Padding = PaddingMode.None; des.GenerateIV(); System.Security.Cryptography.ICryptoTransform ict = des.CreateEncryptor(keyBytes, des.IV); CryptoStream cs = new CryptoStream(ms, ict, CryptoStreamMode.Write); cs.Write(clearBytes, 0, clearBytes.Length); cs.FlushFinalBlock(); ms.Close(); byte[] cipherBytes = ms.ToArray(); // create a byte output stream for Acme compatibality MemoryStream acmeCompatStream = new MemoryStream(); // Acme writes the IV to the frist block acmeCompatStream.Write(des.IV, 0, 8); for (int i = 0; i < cipherBytes.Length; i = i + 8) { // write the next block acmeCompatStream.Write(cipherBytes, i, 8); // write the number of valid bytes in the block if (i == cipherBytes.Length - 8) acmeCompatStream.WriteByte(lastByte); else acmeCompatStream.WriteByte(8); } acmeCompatStream.Close(); cipherBytes = acmeCompatStream.ToArray(); return (System.Convert.ToBase64String(cipherBytes)); } 

下面是我在java中尝试过的代码。 我有两种不同的加密function。 我尝试了两种加密方法。 但两者都没有给出预期的加密字符串来解密。

  package com.abc.some.common.nativeDES; import java.io.ByteArrayOutputStream; import java.security.spec.KeySpec; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; import javax.crypto.spec.IvParameterSpec; import javax.xml.bind.DatatypeConverter; public class DESEncrypt { public String keyValue = "123456789"; public static void main(String[] args) { String text = "1564578"; String codedtext ="not encrypted"; try{ codedtext = new DESEncrypt().Encrypt1(text); //codedtext = new DESEncrypt().encrypt(text); }catch (Exception e) { System.out.println("Exception in Encryption.. " + e.getMessage()); } System.out.println(codedtext); } public String Encrypt1(String CXML) { try { KeySpec myKey = new DESKeySpec(keyValue.getBytes("UTF8")); SecretKey key = SecretKeyFactory.getInstance("DES").generateSecret(myKey); Cipher ecipher = Cipher.getInstance("DES"); ecipher.init(Cipher.ENCRYPT_MODE, key); byte[] data = CXML.getBytes("ASCII"); Cipher c = Cipher.getInstance("DES/CBC/PKCS5Padding"); c.init(Cipher.ENCRYPT_MODE, key); byte[] crypt = ecipher.doFinal(data); //String encoded = DatatypeConverter.printBase64Binary(crypt.toString().getBytes("ASCII")); //String encoded = DatatypeConverter.printBase64Binary(crypt.getBytes("ASCII")); String encoded = DatatypeConverter.printBase64Binary(crypt).toString(); System.out.println(encoded); return encoded; } catch (Exception ex) { } return null; } } 

但我使用下面的java文件来加密使用acme jar文件的字符串。 这是按预期工作的。 但根据我的项目要求,我不应该使用外部(ACME)jar文件。

 package com.abc.common.encryption; import java.io.FileInputStream; import java.util.Properties; import Acme.Crypto.SecurityDES; public class ESBCryptoDES { public static void main(String args[]){ // DESEncrypt("1564578" // ,"D:\\name\\proj\\order\\Encryption\\st.properties"); DESDecrypt("vQ9C7ZrLzjQpHvZjtHvUb0mFCr824/aClY2jKbeciczsRVr+kEETFvDuHgdBS/aLskYV3WX3U5TANSlK3pH80r3xOyn9Q8rTjlB/yXyU7J9MgibJ66jJx0wrqeloAkmQzqj+b5+I/lXANSlK3pH80kT1D+jqWAeV" ,"D:\\name\\proj\\order\\Encryption\\stDecrypt.properties"); } public static String DESEncrypt(String SourceStrForCrypt,String PropPath) { String encrypt = ""; String decrypt = ""; // Load the property file. Properties prop = new Properties(); try { FileInputStream in = new FileInputStream(PropPath); prop.load(in); in.close(); } catch (Exception e) { System.out.println("Exception in loading property file.. " + e.getMessage()); } // Encrypt the given content. try { String keypath = prop.getProperty("proj.sample.DEV"); System.out.println("sample" + keypath); String SourceToEncrypt = SourceStrForCrypt; //This will provide the xml string to encrypt // Encryption encrypt = SecurityDES.DesEncryptBase64(keypath,SourceToEncrypt); System.out.println(encrypt); // Decryption decrypt = SecurityDES.DesDecryptBase64(keypath, encrypt); System.out.println(decrypt); } catch (Exception e) { System.out.println("Exception in Encryption.. " + e.getMessage()); } return encrypt; } public static String DESDecrypt(String SourceStrForCrypt,String PropPath) { // TODO Auto-generated method stub String decrypt = ""; Properties prop = new Properties(); try { FileInputStream in = new FileInputStream(PropPath); prop.load(in); in.close(); } catch (Exception e) { System.out.println("Exception in loading property file.. "+ e.getMessage()); } try { String abc_keyPath = prop .getProperty("proj.abc.DEV"); System.out.println("keypath" + abc_keyPath); // Decryption decrypt = SecurityDES.DesDecryptBase64(abc_keyPath, SourceStrForCrypt); System.out.println("decrypted..."+decrypt); } catch (Exception e) { System.out.println("Exception in Encryption.. " + e.getMessage()); } return decrypt; } } 

  • 两次调用doFinal()没有意义。
  • 打印byte[].toString()的值没有意义。 它不包含密文。
  • 将其转换为base-64没有意义。 它仍然不包含密文。

您需要将第一个doFinal()调用返回的byte[]数组直接转换为base-64,而不是通过调用toString()然后调用`getBytes()导致往返String()的往返。

NB由于某种原因,你的解密方法中有一个名为encrypt的变量,并且由于某些更奇怪的原因你返回它而不是decrypt ,这是唯一实际包含明文的变量。