【问题标题】:Convert AES encryption java to Python将 AES 加密 java 转换为 Python
【发布时间】:2018-03-25 15:39:04
【问题描述】:

我有执行 AES 加密的 Java 代码,我想将其转换为在 python 中工作。这是一个主类,我制作了 initVector 常量,以便更容易查看它是否有效:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.*;
import java.io.BufferedWriter;



public class test {
public static void main(String [] args)
{
    String ss = "pUypiz-7hJ0y_JtpKWaydp";
    String url = "";
    String toBeEncrypted = "";
    String initVector = "IqtY8jgALtjZNLM5";
    String encodedInitVector = Encryptor.encodeB64mod(initVector.getBytes());
    toBeEncrypted = "ch21979714702=put";
    ss = Encryptor.decodeB64Mod(ss);
    url = "i=" + encodedInitVector + "\n&a=" + Encryptor.encrypt(initVector, ss, toBeEncrypted);
    System.out.println(url);
}
}

这是加密类:

import android.util.Base64;
import java.util.Random;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.io.IOUtils;
import java.util.*;

public class Encryptor {

public static String encrypt(String initVector, String key, String clearText) {
    try {
        byte[] value = clearText.getBytes("UTF-8");
        IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8"));
        SecretKeySpec skeySpec = new SecretKeySpec(Base64.decode(key, 0), "AES");
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
        cipher.init(1, skeySpec, iv);
        return encodeB64mod(cipher.doFinal(value));
    } catch (Exception ex) {
        ex.printStackTrace();
        return "";
    }
}

public static String encodeB64mod(byte[] bytes) {
    return Base64.encodeToString(bytes, 2).replace('+', '-').replace(IOUtils.DIR_SEPARATOR_UNIX, '_').replace("=", "");
}



}

我试图让它在 python 中工作,但我做错了什么

编辑:

import base64
from Crypto.Cipher import AES
from Crypto import Random
raw ='ch21979714702=put'.encode('utf-8')
key = 'pUypiz-7hJ0y_JtpKWaydp' #should be conveted to hex
iv = b'IqtY8jgALtjZNLM5'
cipher = AES.new( key, AES.MODE_CBC, iv )
print (base64.b64encode( cipher.encrypt( raw ) ).decode('utf-8') )

【问题讨论】:

  • 这不是写代码的服务,要自己努力。
  • 我添加了 python 代码,我试图让它工作,但无论我如何转换密钥,我都无法获得 16 字节的长度
  • 运行python代码会发生什么?
  • “ValueError:不正确的 AES 密钥长度(22 字节)”我尝试对密钥进行 base64 解码,但随后得到 11 字节的密钥
  • 变量很便宜(实际上是免费的),不要重复使用不同的东西并让它们命名它们所拥有的东西,ss 似乎没有命名任何东西..

标签: java python encryption aes


【解决方案1】:

您需要 base64url 解码,这不是通用的 base 64 编码:它将 + 替换为 -/ 替换为 _。这就是在 Java 中执行反向替换的原因。

Here 是解码它的正确方法。请对它投赞成票并对不包括替换字符= 字符 结尾的任何答案投反对票。

【讨论】:

    【解决方案2】:

    问题在于 Python 中需要使用填充

    from Crypto.Util import Padding Padding.pad(raw, 16, style='pkcs7')

    https://www.pycryptodome.org/en/latest/src/util/util.html

    与 Python 中的 java 不同,您需要添加要使用填充的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-16
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-07
      • 1970-01-01
      相关资源
      最近更新 更多