C# AES Java加密

C# AES Java加密,c#,encryption,aes,C#,Encryption,Aes,我正在用java为移动平台开发一个应用程序。该程序使用来自Windows C#应用程序的数据,该应用程序对移动应用程序将使用的在线数据库中的密码进行加密 移动应用程序需要连接到数据库,从数据库中检索加密字符串并解密 我使用以下代码使解密工作正常 public String decrypt(String encryptedPassword) { String plainPassword = ""; try { Secr

我正在用java为移动平台开发一个应用程序。该程序使用来自Windows C#应用程序的数据,该应用程序对移动应用程序将使用的在线数据库中的密码进行加密

移动应用程序需要连接到数据库,从数据库中检索加密字符串并解密

我使用以下代码使解密工作正常

public String decrypt(String encryptedPassword)
    {
        String plainPassword = "";
        try
        {
            SecretKeySpec key = new SecretKeySpec("hcxilkqbbhczfeultgbskdmaunivmfuo".getBytes("US-ASCII"), "AES");

            IvParameterSpec iv = new IvParameterSpec("ryojvlzmdalyglrj".getBytes("US_ASCII"));

            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");

            cipher.init(Cipher.DECRYPT_MODE, key, iv);

            byte[] encoded = cipher.doFinal(Base64.decodeBase64(encryptedPassword.getBytes()));
            plainPassword = new String(encoded);
        }
        catch (Exception ex)
        {
            Log.d("Decryption Error", ex.toString());
        }

        return plainPassword;
    }
解密工作非常好,所以我使用了与解密相同的代码进行加密,但将密码模式从decrypt更改为encrypt。但是,当我向控制台打印加密密码时,它会打印一堆垃圾,这些垃圾与应该存储在数据库中的字符串没有任何相似之处

我使用了以下代码来进行加密

public String encrypt(String plainPasword)
    {
        String password = "";
        try
        {
            SecretKeySpec key = new SecretKeySpec("hcxilkqbbhczfeultgbskdmaunivmfuo".getBytes("US-ASCII"), "AES");

            IvParameterSpec iv = new IvParameterSpec("ryojvlzmdalyglrj".getBytes("US_ASCII"));

            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");

            cipher.init(Cipher.ENCRYPT_MODE, key, iv);

            byte[] encoded = cipher.doFinal(plainPasword.getBytes());
            password = new String(encoded);


        }
        catch (Exception ex)
        {
            Log.d("Encryption Error", ex.toString());
        }
        return password;
    }

感谢您在您调用的解密函数中给予我的任何帮助

byte[] encoded = cipher.doFinal(Base64.decodeBase64(encryptedPassword.getBytes()));
因此,您要将ASCII字节转换为Base64字节,然后对它们进行解密

如果你真的只打电话,你不会反过来做同样的事情吗

byte[] encoded = cipher.doFinal(plainPasword.getBytes());
您还可以从byte[]数组中创建新字符串(),而不指定使用平台默认编码(而不是ASCII)的编码。那可能也会弄坏东西


如果您查看cipher.doFinal()返回的字节,这些字节应该是乱七八糟的,难道它们与预期的数据没有任何相似之处吗

你为什么要加密密码?!求你了,用咸密码的散列法..打败我吧!我只是想说同样的话:)我还要问为什么OP自己会这么做。除非你真的是内存受限,否则有一些很好的库已经为你处理了所有类似的样板代码。我有一种感觉,我可能在这里做了一些愚蠢的事情,但事情还是发生了。我将您提到的行更改为byte[]encoded=cipher.doFinal(Base64.encodeBase64(plainPasword.getBytes());但是它仍然输出与c#创建的任何东西都不相似的垃圾如果你的解密像字符串->字符串到字节->解码Base64->解密,那么你的加密必须完全相反:加密字节->编码Base64->字节中的字符串它就像解密(Base64解码(字节(输入字符串)))用于解密,而字符串(Base64编码)用于解密(encrypt(bytes)))用于加密;base64和加密必须反转Wesome,非常感谢您的帮助,我已经让它工作了。再次感谢您。