首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Java加密而解密方法是已知的

用Java加密而解密方法是已知的
EN

Stack Overflow用户
提问于 2019-03-18 07:49:07
回答 1查看 277关注 0票数 0

我尝试在Java中建立加密和解密机制。我找到了一些解密代码,但我不知道如何加密。什么样的加密方法将与这样的解密方法兼容:

代码语言:javascript
复制
private byte[] padKey(byte[] key) {
        byte[] paddedKey = new byte[32];
        System.arraycopy(key, 0, paddedKey, 0, key.length);
        return paddedKey;
    }

    private byte[] unpad(byte[] data) {     
        byte[] unpaddedData = new byte[data.length - data[data.length - 1]];
        System.arraycopy(data, 0, unpaddedData, 0, unpaddedData.length);
        return unpaddedData;
    }


public String decrypt(String encodedJoinedData) throws Exception {

        // Base64-decode the joined data
        byte[] joinedData = Base64.decode(encodedJoinedData); 

        // Get IV and encrypted data
        byte[] iv = new byte[16];
        System.arraycopy(joinedData, 0, iv, 0, iv.length);
        byte[] encryptedData = new byte[joinedData.length - iv.length];
        System.arraycopy(joinedData, iv.length, encryptedData, 0, encryptedData.length);

        // Pad key
        byte[] key = padKey("SiadajerSiadajer".getBytes()); 
        Key aesKey = new SecretKeySpec(key, "AES");

        // Specify CBC-mode
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
        IvParameterSpec ivParameterSpec = new IvParameterSpec(iv); 
        cipher.init(Cipher.DECRYPT_MODE, aesKey, ivParameterSpec);

        // Decrypt data
        byte[] decryptedData = cipher.doFinal(encryptedData);

        // Remove custom padding
        byte[] unpaddedData = unpad(decryptedData);         

        return new String(unpaddedData);
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-18 13:18:28

如果您正在寻找与decrypt-method对应的加密,则只需在decrypt-method中逆转该过程即可。必须在encrypt-method的正文中执行以下操作(让plainText是包含纯文本的String-parameter ):

  1. 添加自定义填充 // Pad数据(自定义填充) byte[] paddedData = pad(plainText.getBytes(),16);
  2. 加密纯文本 // Pad密钥byte[] Key =padKey(“SiadajerSiadajer”.getBytes();key aesKey = new SecretKeySpec( key,"AES");//指定分组密码(AES)、模式(CBC)和填充(PKCS5)密码=Cipher.getInstance(“AES/CBC/PKCS5Padd”);//创建随机IV secureRandom SecureRandom =新SecureRandom(SecureRandom);字节iv[] =新bytecipher.getBlockSize();secureRandom.nextBytes(iv);ivParameterSpec IvParameterSpec =新IvParameterSpec(iv);//加密数据cipher.init(Cipher.ENCRYPT_MODE,aesKey,ivParameterSpec);byte[] encryptedData = cipher.doFinal(paddedData);
  3. 连接IV和加密数据 //连接IV和加密数据byte[] joinedData =新的byteiv.length + encryptedData.length;System.arraycopy(iv,0,joinedData,0,iv.length);System.arraycopy(encryptedData,0,joinedData,iv.length,encryptedData.length);
  4. 基64-对已连接的数据进行编码 // Base64 64-编码数据字符串encodedJoinedData = Base64.encode(joinedData,0);

最后,必须返回encodedJoinedData

此外,您还必须实现自定义填充。以下方法实现了自定义的PKCS5 5填充,并可能与unpad-method相对应:

代码语言:javascript
复制
private byte[] pad(byte[] data, int size) {
    byte padLength = (byte)(size - (data.length % size));
    byte[] paddedData = new byte[data.length + padLength];
    System.arraycopy(data, 0, paddedData, 0, data.length);
    for (int i = data.length; i < paddedData.length; i++)
        paddedData[i] = (byte)padLength;
    return paddedData;
}

顺便说一句,您的decrypt-method (以及encrypt-method)有一些问题:

  • 您不应该使用硬编码的密钥,但这可能只是为了测试目的。要创建安全的AES密钥,请参见例如How to create a secure random AES key in Java?
  • 最明显的缺陷是,它在decrypt/encrypt-method中打开/填充了两次,这没有任何意义。因此,移除所选的PKCS5 5填充(即从AES/CBC/PKCS5Padding更改为AES/CBC/NoPadding)或自定义填充( decrypt-和encrypt-method )(前提是在项目范围内这是可能的)。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55216692

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档