当前位置: 首页 > 面试题库 >

用Java加密并用C#解密AES 256位

单于高逸
2023-03-14
问题内容

1.我有java函数来加密xml文件并返回加密的字符串。

    /// 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.我有c#函数可以解密通过java函数加密的消息。

    /// 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加密功能运行良好。但是问题是C#函数,
当我解密时出现以下错误消息

CryptographicException: Length of the data to decrypt is invalid.

我通过使用下面的参考来搜索解决方案

  1. Java中的AES加密和C#中的解密
  2. C#/ Java | AES256加密/解密
  3. C#和Java中的加密/解密

但我仍然遇到同样的错误。有人可以给我建议吗?

更新

我只是更改我的C#加密函数。以下是我的变更清单

  1. 块大小为128
  2. 密钥大小为256
  3. IV尺寸至16
  4. 密钥大小为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);
    

    }

此时,没有错误发生。但是我收到了我无法阅读的解密消息。

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

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


问题答案:

我相信blockSize应该是128,keysize是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.我有java函数,它加密xml文件并返回加密的字符串。 2.我有c#函数,它可以解密由java函数加密的消息。 Java加密功能运行良好。但问题是C函数, 当我解密时,会得到下面的错误消息 我使用下面的参考搜索解决方案 Java中的AES加密和C#中的解密 C#/Java|AES256加密/解密 C#和Java中的加密/解密 但我仍然面临同样的错误。谁能给我提个建议吗。 我只是改变我的C#加密

  • 我将AES与salt和IV一起用于加密和解密一个唯一的ID,但它给出了javax。加密。解密时出现BadPaddingException。 每次解密数据时给出的完整错误堆栈跟踪 加密方法- 解密方法 我是JCA的新手。

  • 我试图解密C#加密数据在Java没有成功。我用的是128位密钥 这是java代码: 你知道会出什么问题吗? 谢谢 使现代化 对不起,我太笨了,我忘了写实际的错误消息。这是: 线程“main”javax中出现异常。加密。BadPaddingException:组织中的填充块已损坏。弹跳船舱。jcajce。供应商。对称的。util。基本分组密码。javax上的engineDoFinal(未知源代码)。

  • 我遇到的情况是,JSON在PHP的中加密,需要在JAVA中解密。 此包含正确的数据,现在已解密。 现在,问题是当我试图做同样的事情在Java它不起作用:( 这是: 我已经访问了类似的问题,如 AES-256 CBC用php加密,用Java解密,反之亦然 openssl_在java中加密256个CBC原始_数据 无法在Java和PHP之间交换使用AES-256加密的数据 名单还在继续。。。。但是运气

  • 问题内容: 我想将加密的密码存储在Java文件中。我在使用 javax.crypto 的解决方案中看到了一个问题,但是问题在于密钥是动态生成的,并且是随机的。 然后将在运行时在Java程序中获取并解密该密码。鉴于我要在文件中存储一个已经加密的密码-解密时我想要正确的文本。 有没有办法告诉javax.crypto方法: 可以将其替换为基于某个私钥生成的我自己的密钥吗? 谁能指出一些有关执行此操作的资

  • 问题内容: 我想用Java加密和解密密码,然后以加密形式存储到数据库中。如果它是开源的,那就太好了。有什么建议/建议吗? 问题答案: 编辑 :这个答案是旧的。现在 不建议 使用MD5,因为它很容易被破坏。 我想象中的MD5必须足够好?您可以使用MessageDigest实现它。 这里还列出了其他算法。 如果确实需要,这是它的第三方版本: Fast MD5