使用本机java类进行DES加密

时间:2017-03-09 08:43:26

标签: java algorithm encryption cryptography encryption-symmetric

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

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

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

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

我的问题是在本机java类中加密的字符串应该是acme的8个字节的长度倍数。在java中我们如何才能实现相同的目标。因此我收到Input length not multiple of 8 bytes

错误

C#代码

 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中尝试过的代码。我有两种不同的加密功能。我尝试了两种加密方法。但两者都没有给出预期的加密字符串来解密。

使用原生java库的Java代码 -

    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 = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?><SomeRequest><OrderNumber>1564578</OrderNumber></SomeRequest>";
        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/NoPadding");
        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文件。

使用ACME Jar文件的Java代码 -

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("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?><SomeRequest><OrderNumber>1564578</OrderNumber></SomeRequest>"
//              ,"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;

    }
}

0 个答案:

没有答案