java - 加密类在 java 中工作但在 android 中不工作,为什么?我还可以做些什么?

标签 java android encryption

我在 java 中做了一个简单的加密/解密字符串类并测试了它。它工作正常,现在我试图在 android 设备中使用它来加密字符串,将其发送到我的服务器并在那里解密。全部使用相同的自定义类。为什么这不起作用?是不是根本不支持?为此,我还能做些什么来轻松加密/解密字符串?不接受 Base64:)

package crypto;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;


public class Crypto {
    public static byte[] encrypt(String message) throws Exception
    {
        String symmetricKey = "25Ae1f1711%z1 )1";
        SecretKeySpec aesKey = new SecretKeySpec(symmetricKey.getBytes(), "AES");
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding", "SunJCE");
        cipher.init(Cipher.ENCRYPT_MODE, key);
        return cipher.doFinal(message.getBytes());
    }
    public static String decrypt(byte[] encryptedMessage) throws Exception
    {
        String symmetricKey = "25Ae1f1711%z1 )1";
        SecretKeySpec aesKey = new SecretKeySpec(symmetricKey.getBytes(), "AES");
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding", "SunJCE");
        cipher.init(Cipher.DECRYPT_MODE, key);
        return new String(cipher.doFinal(encryptedMessage));
    }
}

在 logcat 中,我可以看到弹出以下异常:java.security.NoSuchProviderException: Provider not avalible: SunJCE

我从行中删除了指定的提供者“SunJCE”。

Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding", "SunJCE");

我通过 here 找到了解决方案

现在我在服务器端收到此错误:

javax.crypto.IllegalBlockSizeException: Input length must be multiple of 16 when decrypting with padded cipher
    at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:750)
    at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:676)
    at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:317)
    at javax.crypto.Cipher.doFinal(Cipher.java:1813)
    at crypto.Crypto.decrypt(Crypto.java:20)
    at io.network.UDPServer.run(UDPServer.java:37

用BC试过还是有同样的错误

最佳答案

试试这个代码: 像这样调用加密方法:encrypt_text = Encrypt(Text,"avs3qt");

加密函数定义:

String Encrypt(String text, String key) throws Exception {
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    byte[] keyBytes = new byte[16];
    byte[] b = key.getBytes("UTF-8");
    int len = b.length;
    if (len > keyBytes.length)
        len = keyBytes.length;
    System.arraycopy(b, 0, keyBytes, 0, len);
    SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
    IvParameterSpec ivSpec = new IvParameterSpec(keyBytes);
    cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);

    byte[] results = cipher.doFinal(text.getBytes("UTF-8"));
    BASE64Decoder encoder = new BASE64Decoder();
    return encoder.encodeBytes(results);
}

像这样调用Decrypt方法:

decrypt_text = Decrypt(Text, "avs3qt");

函数定义:

String Decrypt(String text, String key) throws Exception {
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    byte[] keyBytes = new byte[16];
    byte[] b = key.getBytes("UTF-8");
    int len = b.length;
    if (len > keyBytes.length)
        len = keyBytes.length;
    System.arraycopy(b, 0, keyBytes, 0, len);
    SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
    IvParameterSpec ivSpec = new IvParameterSpec(keyBytes);
    cipher.init(Cipher.DECRYPT_MODE, keySpec,ivSpec);

    BASE64Decoder decoder = new BASE64Decoder();
    byte[] results = cipher.doFinal(decoder.decode(text));
    return new String(results, "UTF-8");
}

关于java - 加密类在 java 中工作但在 android 中不工作,为什么?我还可以做些什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17925572/

相关文章:

java - Log4j2记录ThreadPoolExecutor未捕获的异常

java - 从servlet请求java获取客户端IP地址

java - 如何在 LibGdx 核心中使用 Android 方法

php - 比 md5 更短的 php 密码?

java - AES Java 到 Python

java - Spring Configuration 类放置最佳实践

Android关闭自定义对话框

android - ionic 推送通知自定义声音不在 Android 中播放

Java非对称加密: preferred way to store public/private keys

java - 在面板上的缓冲图像上绘制文本