加密Java和解密在C#中的AES 256位 [英] Encrypt in java and Decrypt in C# For AES 256 bit

查看:1005
本文介绍了加密Java和解密在C#中的AES 256位的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

1.我有哪些加密的XML文件,并返回加密的字符串Java函数。

  ///的Java类
进口java.security.Key中;
进口javax.crypto.Cipher中;
进口javax.crypto.spec.SecretKeySpec;
进口org.apache.commons.codec.binary.Base64;

公共类地穴{

公共静态字符串键=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;
公共静态的byte [] key_Array = Base64.decodeBase64(键);

公共静态加密字符串(字符串strToEncrypt)
{

{
//密码_Cipher = Cipher.getInstance(AES);
//密码_Cipher = Cipher.getInstance(AES / ECB / PKCS5PADDING);
//密码_Cipher = Cipher.getInstance(AES / CBC / PKCS5PADDING);

键SecretKey的=新SecretKeySpec(key_Array,AES);

密码_Cipher = Cipher.getInstance(AES);
_Cipher.init(Cipher.ENCRYPT_MODE,SecretKey的);

返回Base64.encodeBase64String(_Cipher.doFinal(strToEncrypt.getBytes()));
}
赶上(例外五)
{
的System.out.println([异常]:+ e.getMessage());
}
返回NULL;
}

公共静态无效的主要(字串[] args){
StringBuilder的SB =新的StringBuilder();
sb.append(xml文件串......);

字符串EncryptedString =加密(sb.toString());
的System.out.println([EncryptedString]:+ EncryptedString);
}
}



2.我有哪些解密消息C#功能,由Java函数加密。

  /// C#功能
私人静态字符串解密(字符串encryptedText )
{
RijndaelManaged的aesEncryption =新RijndaelManaged的();
aesEncryption.BlockSize = 256;
//aesEncryption.KeySize = 256;
//aesEncryption.Mode = CipherMode.CBC;
//aesEncryption.Padding = PaddingMode.PKCS7;

串keyStr =xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;
//字符串ivStr =xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;

字节[] = keyArr Convert.FromBase64String(keyStr);
//字节[] = ivArr Convert.FromBase64String(ivStr);

aesEncryption.Key = keyArr;
//aesEncryption.IV = ivArr;

ICryptoTransform的decrypto = aesEncryption.CreateDecryptor();

字节[] = encryptedBytes Convert.FromBase64CharArray(encryptedText.ToCharArray(),0,encryptedText.Length);
字节[] = decryptedData decrypto.TransformFinalBlock(encryptedBytes,0,encryptedBytes.Length); /// CryptographicException:数据的长度来解密是无效的。
返回ASCIIEncoding.UTF8.GetString(decryptedData);
}



Java的加密功能是工作。但问题是C#的功能,结果当我解密,我得到以下错误消息

  CryptographicException:数据的长度解密是无效的。 



我用下面的裁判




  • AES Java和加密解密在C#

  • C#/ Java的| AES256加密/解密

  • 在C#和Java

  • $ Encyption /解密b
    $ b

    但我还是面临着相同的error.Could任何人给我建议,请。



    更新



    我就改变我的C#加密功能。下面是我的更改列表




    1. 块大小为128

    2. 密钥大小为256

    3. IV尺寸为16

    4. 密钥大小32



      ///更新解密功能
    私人静态字符串解密(字符串encryptedText)
    {
    RijndaelManaged的aesEncryption =新RijndaelManaged的();
    aesEncryption.BlockSize = 128;
    aesEncryption.KeySize = 256;

    //aesEncryption.Mode = CipherMode.CBC;
    aesEncryption.Padding = PaddingMode.None;

    串keyStr =xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;
    串ivStr =xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;

    字节[] = ivArr Convert.FromBase64String(ivStr);
    字节[] = IVkey16BytesValue新的字节[16];
    Array.Copy(ivArr,IVkey16BytesValue,16);

    字节[] = keyArr Convert.FromBase64String(keyStr);
    字节[] = KeyArr32BytesValue新的字节[32];
    Array.Copy(keyArr,KeyArr32BytesValue,32);

    aesEncryption.IV = IVkey16BytesValue;
    aesEncryption.Key = KeyArr32BytesValue;

    ICryptoTransform的decrypto = aesEncryption.CreateDecryptor();

    字节[] = encryptedBytes Convert.FromBase64CharArray(encryptedText.ToCharArray(),0,encryptedText.Length);
    字节[] = decryptedData decrypto.TransformFinalBlock(encryptedBytes,0,encryptedBytes.Length);
    返回ASCIIEncoding.UTF8.GetString(decryptedData);
    }

    在这个时候,发生错误。但我得到解密的消息,我可以不读

      G:\0\tdY\\\ \\符O\rLWwHm> f\au%0\ .......... 

    请让我再次得到您的建议。


    解决方案

    我相信块大小应该是128和密钥长度是256。keyStr要长32个字符和IVstr应16个字符长。这可以帮助,因为它描述了为什么128位必须被用于块大小和密钥大小可以是什么。 csrc.nist.gov/publications/fips/fips197/fips-197.pdf



    您在解密的方法都没有了。

      aesEncryption.Padding = PaddingMode.None; 



    我相信你需要放进了加密方法也。



    此外,为什么不使用的密钥和IV此方法。

      aes.Key = ASCIIEncoding.ASCII.GetBytes(keyStr); 
    aes.IV = ASCIIEncoding.ASCII.GetBytes(ivStr);


    1.I have java function which encrypt xml file and return encrypted String.

    /// Java Class 
    import java.security.Key;
    import javax.crypto.Cipher;
    import javax.crypto.spec.SecretKeySpec;
    import org.apache.commons.codec.binary.Base64;
    
    public class Crypt {
    
        public static String key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
        public static byte[] key_Array = Base64.decodeBase64(key);
    
        public static String encrypt(String strToEncrypt)
        {       
            try
            {   
                //Cipher _Cipher = Cipher.getInstance("AES");
                //Cipher _Cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
                //Cipher _Cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");      
    
                Key SecretKey = new SecretKeySpec(key_Array, "AES");
    
                Cipher _Cipher = Cipher.getInstance("AES");     
                _Cipher.init(Cipher.ENCRYPT_MODE, SecretKey);       
    
                return Base64.encodeBase64String(_Cipher.doFinal(strToEncrypt.getBytes()));     
            }
            catch (Exception e)
            {
                System.out.println("[Exception]:"+e.getMessage());
            }
            return null;
        }
    
        public static void main(String[] args) {        
            StringBuilder sb = new StringBuilder();
            sb.append("xml file string ...");
    
            String EncryptedString = encrypt(sb.toString());        
            System.out.println("[EncryptedString]:"+EncryptedString);
        }
    }
    

    2.I have c# function which decrypt the message which is encrypted by java function.

    /// C# Function
    private static string Decrypt(string encryptedText)
    {
        RijndaelManaged aesEncryption = new RijndaelManaged();            
        aesEncryption.BlockSize = 256;
        //aesEncryption.KeySize = 256;
        //aesEncryption.Mode = CipherMode.CBC;
        //aesEncryption.Padding = PaddingMode.PKCS7;
    
        string keyStr = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
        //string ivStr = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";        
    
        byte[] keyArr = Convert.FromBase64String(keyStr);
        //byte[] ivArr = Convert.FromBase64String(ivStr);
    
        aesEncryption.Key = keyArr;
        //aesEncryption.IV = ivArr;
    
        ICryptoTransform decrypto = aesEncryption.CreateDecryptor();
    
        byte[] encryptedBytes = Convert.FromBase64CharArray(encryptedText.ToCharArray(), 0, encryptedText.Length);  
        byte[] decryptedData = decrypto.TransformFinalBlock(encryptedBytes, 0, encryptedBytes.Length); /// CryptographicException: Length of the data to decrypt is invalid.    
        return ASCIIEncoding.UTF8.GetString(decryptedData); 
    }
    

    Java encrypt function is work well. But the problem is C# function,
    when I decrypt I get below error message

    CryptographicException: Length of the data to decrypt is invalid.
    

    I searched solutions by using below ref

    1. AES Encryption in Java and Decryption in C#
    2. C# / Java | AES256 encrypt/decrypt
    3. Encyption/Decryption in C# and Java

    but I still face the same error.Could anyone give me suggestion please.

    Updated

    I Just change my C# crypto function. Below is my change lists

    1. Block Size to 128
    2. Key Size to 256
    3. IV Size to 16
    4. Key Size to 32

    /// Updated decrypt function
    private static string Decrypt(string encryptedText)
    {
        RijndaelManaged aesEncryption = new RijndaelManaged();            
        aesEncryption.BlockSize = 128;
        aesEncryption.KeySize = 256;
    
        //aesEncryption.Mode = CipherMode.CBC;
        aesEncryption.Padding = PaddingMode.None;
    
        string keyStr = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
        string ivStr = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";           
    
        byte[] ivArr = Convert.FromBase64String(ivStr);
        byte[] IVkey16BytesValue = new byte[16];
        Array.Copy(ivArr, IVkey16BytesValue, 16);
    
        byte[] keyArr = Convert.FromBase64String(keyStr);
        byte[] KeyArr32BytesValue = new byte[32];
        Array.Copy(keyArr, KeyArr32BytesValue, 32);
    
        aesEncryption.IV = IVkey16BytesValue;
        aesEncryption.Key = KeyArr32BytesValue; 
    
        ICryptoTransform decrypto = aesEncryption.CreateDecryptor();
    
        byte[] encryptedBytes = Convert.FromBase64CharArray(encryptedText.ToCharArray(), 0, encryptedText.Length);
        byte[] decryptedData = decrypto.TransformFinalBlock(encryptedBytes, 0, encryptedBytes.Length); 
        return ASCIIEncoding.UTF8.GetString(decryptedData);
    }
    

    In this time, no error occur. But I get decrypted message which i cannot read.

    g:�\0�\td��Y\\符O����\rL��W�wHm�>f�\au����%��0��\ ..........
    

    Please let me get your suggestion again.

    解决方案

    I believe the blockSize should be 128 and the keysize be 256. The keyStr should be 32 characters long and the IVstr should be 16 characters long. This may help as it describes why 128 bits have to be used for block size and what the key sizes can be. csrc.nist.gov/publications/fips/fips197/fips-197.pdf

    You have this in the decrypt method.

        aesEncryption.Padding = PaddingMode.None; 
    

    I believe you need to put that in the encrypt method also.

    Also why not use this method for the key and IV.

        aes.Key = ASCIIEncoding.ASCII.GetBytes(keyStr); 
        aes.IV = ASCIIEncoding.ASCII.GetBytes(ivStr);
    

    这篇关于加密Java和解密在C#中的AES 256位的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆