python3 - AES 加密实现java中SHA1PRNG 算法

hive中常用的函数 (一)聚合函数 1、count 个数统计函数: count(*) 2、sum 总和统计函数:sum(score) 3、max 最大值统计函数:max(score) 4、min 最小值统计函数:min(score) 5、avg 平均值统计函数:avg(score) (二)窗口函数 1、rank 考虑分组内数据的重复性,重复的会挤占后续的标号: rank() over(parti... 阅读详情

python3 - Java AES 加密实现java中SHA1PRNG 算法

Max.Bai

2019-02

目录

python3 - Java AES 加密实现java中SHA1PRNG 算法

0x00 事由

0x01 Java实现

0x02 Python3实现

0x03 总结

0x04 完整代码


0x00 事由

最近和java项目对接遇到AES加密算法,java代码有SecureRandom.getInstance("SHA1PRNG"); python实在找不到对应的方法,C#,php,js代码各种查到,大家都有遇到,解决的不多,C# 直接用java算出key,然后用C#再算AES(https://blog.youkuaiyun.com/yunhua_lee/article/details/17226089),耗时差不多2天,最终在php代码中找到方法(https://github.com/myGGT/crypt_aes/blob/master/crypt_aes.php),相关JavaScript代码(https://github.com/bombworm/SHA1PRNG/blob/master/index.js),记录下来给大家使用。

鉴于讨论的人多我在2020-11做一个总结,并写了一个开箱即用的类,可去这篇查看:Python - AES sha1prng 加密解密总结  更新于2020-11

 

0x01 Java实现

Java 加密参数说明(使用库)

AES加密模式:ECB/CBC/CTR/OFB/CFB
填充:pkcs5padding/pkcs7padding/zeropadding/iso10126/ansix923
数据块:128位/192位/256位

我们就以java默认AES加密方法为例,其他加密模拟基本都是对key的处理一样。Java默认AES加密模式是"AES/ECB/PKCS5Padding"。

java代码:


public static String AES_Encode(String encodeRules,String content){
    try {
        //1.构造密钥生成器,指定为AES算法,不区分大小写
        KeyGenerator keygen=KeyGenerator.getInstance("AES");
        //2.根据ecnodeRules规则初始化密钥生成器
        //生成一个128位的随机源,根据传入的字节数组
        //keygen.init(128, new SecureRandom(encodeRules.getBytes()));
        SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
        secureRandom.setSeed(encodeRules.getBytes());
        keygen.init(128, secureRandom);
        //3.产生原始对称密钥
        SecretKey original_key=keygen.generateKey();
        //4.获得原始对称密钥的字节数组
        byte [] raw=original_key.getEncoded();
        //5.根据字节数组生成AES密钥
        SecretKey key=new SecretKeySpec(raw, "AES");
        //6.根据指定算法AES自成密码器
        Cipher cipher=Cipher.getInstance("AES");
        //7.初始化密码器,第一个参数为加密(Encrypt_mode)或者解密解密(Decrypt_mode)操作,第二个参数为使用的KEY
        cipher.init(Cipher.ENCRYPT_MODE, key);
        //8.获取加密内容的字节数组(这里要设置为utf-8)不然内容中如果有中文和英文混合中文就会解密为乱码
        byte [] byte_encode=content.getBytes("utf-8");
        //9.根据密码器的初始化方式--加密:将数据加密
        byte [] byte_AES=cipher.doFinal(byte_encode);
        //10.将加密后的数据转换为字符串
        //这里用Base64Encoder中会找不到包
        //解决办法:
        //在项目的Build path中先移除JRE System Library,再添加库JRE System Library,重新编译后就一切正常了。

        //String AES_encode=new String(new BASE64Encoder().encode(byte_AES));
        String AES_encode = new String(bytesToHexString(byte_AES));
        //11.将字符串返回
        return AES_encode;
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (NoSuchPaddingException e) {
        e.printStackTrace();
    } catch (InvalidKeyException e) {
        e.printStackTrace();
    } catch (IllegalBlockSizeException e) {
        e.printStackTrace();
    } catch (BadPaddingException e) {
        e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }

    //如果有错就返加nulll
    return null;
}

最主要的代码:

            KeyGenerator kgen = KeyGenerator.getInstance("AES");
            SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
            secureRandom.setSeed(keyWord.getBytes());
            kgen.init(128, secureRandom);
            SecretKey secretKey = kgen.generateKey();

这几行就是要把密码进行了别的加密。坑就在这里,stackoverflow上建议修改java代码,1.指明加密方式和填充 2.不要使用SecureRandom,这个是Oracle实现的,可能在不同版本会产生不同的值,特别是Android(https://blog.youkuaiyun.com/banking17173/article/details/8236028)。 stackoverflow(https://stackoverflow.com/questions/24124091/better-way-to-create-aes-keys-than-seeding-securerandom)。

0x02 Python3实现

安装AES相关库

pip3 install pycryptodome

实现代码:

from base64 import b64encode, encodebytes
from Crypto.Cipher import AES
import binascii
import hashlib

BS = AES.block_size


def padding_pkcs5(value):
    return str.encode(value + (BS - len(value) % BS) * chr(BS - len(value) % BS))


def padding_zero(value):
    while len(value) % 16 != 0:
        value += '\0'
    return str.encode(value)

def aes_ecb_encrypt(key, value):
    # AES/ECB/PKCS5padding
    # key is sha1prng encrypted before
    cryptor = AES.new(bytes.fromhex(key), AES.MODE_ECB)
    padding_value = padding_pkcs5(value)    # padding content with pkcs5
    ciphertext = cryptor.encrypt(padding_value)
    return ''.join(['%02x' % i for i in ciphertext]).upper()

def get_sha1prng_key(key):
    '''[summary]
    encrypt key with SHA1PRNG
    same as java AES crypto key generator SHA1PRNG
    Arguments:
        key {[string]} -- [key]
    
    Returns:
        [string] -- [hexstring]
    '''
    signature = hashlib.sha1(key.encode()).digest()
    signature = hashlib.sha1(signature).digest()
    return ''.join(['%02x' % i for i in signature]).upper()[:32]



hexstr_content = '405EE11002F3'    #content
key = '12532802'  #keypassword
expect_result = 'c1ee1f3f2d74e02706be9af78aa79ba4'.upper()
aes128string = aes_ecb_encrypt(get_sha1png_key(key), hexstr_content)
print(aes128string)

关键代码:

def get_sha1prng_key(key):
    '''[summary]
    encrypt key with SHA1PRNG
    same as java AES crypto key generator SHA1PRNG
    Arguments:
        key {[string]} -- [key]
    
    Returns:
        [string] -- [hexstring]
    '''
    signature = hashlib.sha1(key.encode()).digest()
    signature = hashlib.sha1(signature).digest()
    return ''.join(['%02x' % i for i in signature]).upper()[:32]

实现key的转换,实现了java中关键代码的内容。这里返回的是16进制字符串,你可以修改代码返回想要的格式。

实现了关键代码,其他CBC等加密方式都一样。

0x03 总结

看好多人问,我总结下步骤:

1. 对key进行sha1prng加密,就是文中的get_sha1prng_key方法,拿到加密后的密文当做AES的key

2.确定AES的加密方式ECB,CBC 等,

3. 确定填充方式,0填充(文中padding_zero方法),pkcs5填充(文中padding_pkcs5方法),或者不填充

4. 传入key, 原文,iv(CBC需要), 进行AES加密,获得结果

CBC 还要传入iv 进行处理

AES加密可以参照https://blog.youkuaiyun.com/max229max/article/details/70318782

AES主要注意两个:

1. 加密方法ECB,CBC等。

2. 对key的处理,比如java的sha1prng,或者base64等。

3. 填充,key和原始文本都有可能填充,NoPadding,不填充,0填充,还有pkcs5padding, 不填充就是不对内容填充,直接加密,上面代码实现了\0填充和pkcs5padding 。

总的来说加密内容对不上基本是key处理不一样或者填充不对。

0x04 完整代码

完整代码包含了一点解密代码,不过解密代码没有填充,如果有填充的话,解密完内容需要去掉填充。

from base64 import b64encode, encodebytes
from Crypto.Cipher import AES
import binascii
import hashlib

BS = AES.block_size


def padding_pkcs5(value):
    return str.encode(value + (BS - len(value) % BS) * chr(BS - len(value) % BS))


def padding_zero(value):
    while len(value) % 16 != 0:
        value += '\0'
    return str.encode(value)
    
    
def aes_ecb_encrypt(key, value):
    ''' AES/ECB/NoPadding encrypt '''
    key = bytes.fromhex(key)
    cryptor = AES.new(key, AES.MODE_ECB)
    ciphertext = cryptor.encrypt(bytes.fromhex(value))
    return ''.join(['%02x' % i for i in ciphertext]).upper()

def aes_ecb_decrypt(key:str, value:str) -> str:
    ''' AES/ECB/NoPadding decrypt '''
    key = bytes.fromhex(key)
    cryptor = AES.new(key, AES.MODE_ECB)
    ciphertext = cryptor.decrypt(bytes.fromhex(value))
    return ''.join(['%02x' % i for i in ciphertext]).upper()

def get_userkey(key, value):
    ''' AES/ECB/PKCS5Padding encrypt 
    就是一个普通的AES ECB加密,填充方式是PKCS5Padding 
    '''
    cryptor = AES.new(bytes.fromhex(key), AES.MODE_ECB)
    padding_value = padding_pkcs5(value)
    ciphertext = cryptor.encrypt(padding_value)
    return ''.join(['%02x' % i for i in ciphertext]).upper()

def get_sha1prng_key(key):
    '''[summary]
    encrypt key with SHA1PRNG
    same as java AES crypto key generator SHA1PRNG
    Arguments:
        key {[string]} -- [key]
    
    Returns:
        [string] -- [hexstring]
    '''
    signature = hashlib.sha1(key.encode()).digest()
    signature = hashlib.sha1(signature).digest()
    return ''.join(['%02x' % i for i in signature]).upper()[:32]


# 普通AES ECB加解密
data = '0513011E0005016400000000000000000001000000000000000000000000000000770013011E0005026400000000000000000001000000000000000000000000000000770013011E0005036400000000000000000001000000000000000000000000000000770013011E0005046400000000000000000001000000000000000000000000000000770013011E000505640000000000000000000100000000000000000000000000000077000000000000'   # 原文
key = '43C8B53E236C4756B8FF24E5AA08A549'   #加密key
aes_result = 'AB4F4686218A5FF9F07E5248E6B5525D140602A0FAA21176C9A158A010B1A7C0258E80667BF7DD3B6FF57707B373BF75F57AE634D9F1384002AA6B788F4C658DD77572C207AAE3134F91FB690A4F024EF428DE3E1C5F84D0EA9D01B8AB4ED9FE97D7C0D65D447D92F0E306573F30E1360B3DE999E952BAAB9B22E48B8C7B23DC5480027DEE44988F0E86F7A475EEF599C1D7D3331457E582558BC3447E644913ABD63FC221C2E0D49BD712879261FF5F'   #加密结果
# 加密
aes128string = aes_ecb_encrypt(key, data)
print(aes128string)
# 解密
aes128string = aes_ecb_decrypt(key, aes_result)
print(aes128string)

# sha1prng 加密方式
mac = '405EE11002F3'   #原文
device_id = '12532802' #'12403492' #'12532802'  # 加密key
user_key = 'c1ee1f3f2d74e02706be9af78aa79ba4'.upper()  # 加密结果

# 加密  
# 1.对key 进行sha1prng加密, 就是方法get_sha1png_key
# 2.用加密后的key进行AES AES/ECB/PKCS5Padding 加密, 
# 注意看你的java代码AES加密方式,填充方式,我这里是ECB加密,填充方式是PKCS5Padding 
# get_userkey 方法就是普通的 AES/ECB/PKCS5Padding 加密
# https://blog.youkuaiyun.com/max229max/article/details/70318782  这篇有AES的ECB和CBC加密
aes128string = get_userkey(get_sha1png_key(device_id), mac)
print(aes128string)


# 58F7CD929BFAA0915032536FBA8D3281420E93E3
# 58f7cd929bfaa0915032536fba8d3281
# 58F7CD929BFAA0915032536FBA8D3281
print(get_sha1png_key('12532802')) # 58f7cd929bfaa0915032536fba8d3281

完整java代码:

package javatest;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.io.File; 
import java.io.InputStreamReader; 
import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.FileInputStream; 
import java.io.FileWriter; 
import java.nio.charset.Charset;

import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Base64;
import java.util.Scanner;
import java.util.Arrays;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;


//import sun.misc.BASE64Decoder;
//import sun.misc.BASE64Encoder;
//import RC4;

public class AESEncode {
public static String bytesToHexString(byte[] src){
         StringBuilder stringBuilder = new StringBuilder("");
         if (src == null || src.length <= 0) {
                 return null;
         }
         for (int i = 0; i < src.length; i++) {
                 int v = src[i] & 0xFF;
                 String hv = Integer.toHexString(v);
                 if (hv.length() < 2) {
                         stringBuilder.append(0);
                 }
                 stringBuilder.append(hv);
         }
         return stringBuilder.toString();
}

public static byte[] hexStringToBytes(String hexString) {
	if (hexString == null || hexString.equals("")) {
		return null;
        }
        hexString = hexString.toUpperCase();
        int length = hexString.length() / 2;
        char[] hexChars = hexString.toCharArray();
        byte[] d = new byte[length];
        for (int i = 0; i < length; i++) {
            int pos = i * 2;
            d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));
         }
         return d;
}

private static byte charToByte(char c) {
	    return (byte) "0123456789ABCDEF".indexOf(c);
}




public static String AES_Encode(String encodeRules,String content){
    try {
        //1.构造密钥生成器,指定为AES算法,不区分大小写
        KeyGenerator keygen=KeyGenerator.getInstance("AES");
        //2.根据ecnodeRules规则初始化密钥生成器
        //生成一个128位的随机源,根据传入的字节数组
        //keygen.init(128, new SecureRandom(encodeRules.getBytes()));
        SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
        secureRandom.setSeed(encodeRules.getBytes());
        kgen.init(128, secureRandom);
        //3.产生原始对称密钥
        SecretKey original_key=keygen.generateKey();
        //4.获得原始对称密钥的字节数组
        byte [] raw=original_key.getEncoded();
        //5.根据字节数组生成AES密钥
        SecretKey key=new SecretKeySpec(raw, "AES");
        //6.根据指定算法AES自成密码器
        Cipher cipher=Cipher.getInstance("AES");
        //7.初始化密码器,第一个参数为加密(Encrypt_mode)或者解密解密(Decrypt_mode)操作,第二个参数为使用的KEY
        cipher.init(Cipher.ENCRYPT_MODE, key);
        //8.获取加密内容的字节数组(这里要设置为utf-8)不然内容中如果有中文和英文混合中文就会解密为乱码
        byte [] byte_encode=content.getBytes("utf-8");
        //9.根据密码器的初始化方式--加密:将数据加密
        byte [] byte_AES=cipher.doFinal(byte_encode);
        //10.将加密后的数据转换为字符串
        //这里用Base64Encoder中会找不到包
        //解决办法:
        //在项目的Build path中先移除JRE System Library,再添加库JRE System Library,重新编译后就一切正常了。

        //String AES_encode=new String(new BASE64Encoder().encode(byte_AES));
        String AES_encode = new String(bytesToHexString(byte_AES));
        //11.将字符串返回
        return AES_encode;
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (NoSuchPaddingException e) {
        e.printStackTrace();
    } catch (InvalidKeyException e) {
        e.printStackTrace();
    } catch (IllegalBlockSizeException e) {
        e.printStackTrace();
    } catch (BadPaddingException e) {
        e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }

    //如果有错就返加nulll
    return null;
}
/*
 * 解密
 * 解密过程:
 * 1.同加密1-4步
 * 2.将加密后的字符串反纺成byte[]数组
 * 3.将加密内容解密
 */
public static String AES_Decode(String encodeRules,String content){
	String ss;
    try {
        //1.构造密钥生成器,指定为AES算法,不区分大小写
        KeyGenerator keygen=KeyGenerator.getInstance("AES");
        //2.根据ecnodeRules规则初始化密钥生成器
        //生成一个128位的随机源,根据传入的字节数组
        //keygen.init(128, new SecureRandom(encodeRules.getBytes()));
        SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
        secureRandom.setSeed(encodeRules.getBytes());
        kgen.init(128, secureRandom);
        //3.产生原始对称密钥
        SecretKey original_key=keygen.generateKey();
        //4.获得原始对称密钥的字节数组
        byte [] raw=original_key.getEncoded();
        //5.根据字节数组生成AES密钥
        SecretKey key=new SecretKeySpec(raw, "AES");
        //6.根据指定算法AES自成密码器
        Cipher cipher=Cipher.getInstance("AES");
        //7.初始化密码器,第一个参数为加密(Encrypt_mode)或者解密(Decrypt_mode)操作,第二个参数为使用的KEY
        cipher.init(Cipher.DECRYPT_MODE, key);
        //8.将加密并编码后的内容解码成字节数组
        byte [] byte_content=hexStringToBytes(content);
        //byte [] byte_content= new BASE64Decoder().decodeBuffer(content);
        //System.out.println("ttttttttttttttttttttttttttt");
        //System.out.println(new String(byte_content, "UTF-8"));
        /*
         * 解密
         */
        byte [] byte_decode=cipher.doFinal(byte_content);
        String AES_decode=new String(byte_decode,"utf-8");
        return AES_decode;
    } catch (NoSuchAlgorithmException e) {
		ss = "NoSuchAlgorithmException";
        e.printStackTrace();
    } catch (NoSuchPaddingException e) {
		ss = "NoSuchPaddingException";
        e.printStackTrace();
    } catch (InvalidKeyException e) {
		ss = "InvalidKeyException";
        e.printStackTrace();
    } catch (IOException e) {
		ss = "IOException";
        e.printStackTrace();
    } catch (IllegalBlockSizeException e) {
		ss = "IllegalBlockSizeException";
        e.printStackTrace();
    } catch (BadPaddingException e) {
		ss = "BadPaddingException";
        e.printStackTrace();
    }

    //如果有错就返加nulll
    return ss;
}




public static void main(String[] args) {
	//MyClass se=new MyClass();
    //Scanner scanner=new Scanner(System.in);
    /*
     * 加密
     */
    System.out.println("使用AES对称加密,请输入加密的规则");
    //String encodeRules=scanner.next();
    System.out.println("请输入要加密的内容:");
    String encodeRules = "a02254eb247146dfa446c4b2795ebf90";
    String content = "32770";
    String outstr = AES_Encode(encodeRules, content);
    System.out.println("根据输入的规则"+encodeRules+"加密后的密文是:"+outstr);


    /*
     * 解密
    */
    System.out.println("使用AES对称解密,请输入加密的规则:(须与加密相同)");
    
    String  byte_str = "0212f41b372fe457c3f7df0757151615";
    outstr = AES_Decode(encodeRules, byte_str);
    System.out.println("根据输入的规则"+encodeRules+"解密后的明文是:"+outstr);
    
}

}

 

 

 

Python之aes-sha1prng包语法、参数和实际应用案例 aes-sha1prng 是 Python 中专注于 AES 加密 与 SHA1-PRNG(SHA1 伪随机数生成器) 结合的加密工具包,核心功能围绕“基于 SHA1 伪随机数种子的 AES 对称加密”展开,解决传统 AES 加密中密钥/IV(初始向量)生成的随机性问题,确保加密过程的安全性与可复现性(相同种子可生成相同密钥/IV)。 阅读详情

相关推荐

SHA1算法的Python实现

在这篇文章中,我们将详细介绍如何使用Python编写一个SHA1算法的实现,并提供相应的源代码。请注意,上述代码仅仅是一个简单的SHA1算法实现示例,用于说明SHA1算法的基本原理。在实际应用中,为了安全性和性能考虑,建议使用标准的密码库或加密算法库中提供的SHA1实现。在上面的代码中,我们首先定义了SHA1算法中需要使用的初始变量h0、h1、h2、h3和h4。然后,我们实现了填充数据的函数。,该函数将输入的消息填充为64字节的倍数,并添加了SHA1算法所需的特定字节。接下来,我们实现了处理数据块的函数。

ByteBuster的博客 565

golang java AES 加密 SHA1PRNG

前言 和不同语言的第三方对接不可避免的遇到语言不一致的问题,比如加解密,有关于 golang 的CBC/ECB/CFB 加密方法,这篇博客写的很全传送门-> 本文主要介绍 java AES 中出现的随机算法SHA1PRNG 生成key,在 golang 中的实现方法 描述 先来看 java 代码 // java 代码 // content:test123 // encryptKey:123456 // 加密结果为:668C826342B8703D86E8BBF404610499 pu...

Baby_lucy的博客 5087

onnx入门教程(一):解决模型部署中的难题

直接使用 PyTorch 模型的话,我们修改几行代码就能实现模型输入的动态化。但在模型部署中,我们要花数倍的时间来设法解决这一问题。现在,让我们顺着解决问题的思路,体验一下模型部署的困难,并学习使用自定义算子的方式,解决超分辨率模型的动态化问题。刚刚的报错是因为 PyTorch 模型在导出到 ONNX 模型时,模型的输入参数的类型必须全部是 torch.Tensor。而实际上我们传入的第二个参数" 3 "是一个整形变量。这不符合 PyTorch 转 ONNX 的规定。我们必须要修改一下原来的模型的输入。

图像学习之旅 1128

创建hive的AES加密解密函数

1.写java代码,打jar包 1.pom.xml文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 ht

summer089089的博客 1万+

LLCE、PFE模块,二层交换/桥接的通用学习转发机制

NXP 文档里给出的正式全称如下:面向 CAN/CAN-FD、LIN、FlexRay 的“低延迟通信引擎”,用多核 M0 固件做报文收发、过滤、路由,把主 CPU 中断负荷降到几乎 0。“数据包转发引擎”,负责以太网帧的分类、修改、转发、VLAN/NAT/IPsec 等 offload,支持 2 Gbit/s 线速且主机负载 ≈0。两者都跑各自固件,通过内部 AXI 桥可互连,实现“CAN→ETH”零主核参与的硬件级网关功能。是它们都集成在。

qq_25461777的博客 1303

UG NX 12.0零基础实战:从草图绘制到三维建模全流程解析

本文详细解析UG NX 12.0从草图绘制到三维建模的全流程,适合零基础用户快速掌握这款工业设计软件。内容涵盖界面设置、基础操作、草图技巧、拉伸旋转建模、布尔运算等核心功能,并通过机械零件实战案例演示完整设计流程,帮助读者系统学习UG NX 12.0的工业设计应用。

weixin_29261711的博客 1175

Python3.6和Java实现AES相互加解密

安装 Crypto 模块 pip install pycryptodome 安装成功后 导入模块报错 需要修改安装包名称 # 找到安装包路径 # C:\python36\Lib\site-packages # 在这个目录你找到这个文件夹的名字:crypto # 将这个文件夹的名字改为: Crypto Python版本 #!/usr/bin/python3 # -*- coding: utf-8...

追心 1388

【AUTOSAR】MCU Port的配置(MCAL)【EB】

熟悉Classic AUTOSAR架构的朋友应该知道,经常需要用到MCU中的Port这个模块。那么如何通过工具快速配置一个Port呢?

xinsuiwodong2014的博客 9513

Python - AES SHA1PRNG 加密解密总结

Python - AES sha1prng 加密解密总结 Max.Bai 2020-11 上篇文章是当时研究AES加密的时候的记录,来龙去脉可以取看这篇 python3 - AES 加密实现java中SHA1PRNG 算法 好多人回复并提问,我发现还有必要写这篇做一个总结,并写成了一个开箱即用类,添加了ECB,CBC的加解密,当然也包含SHA1PRNG,如果其他类型可以参照里面代码添加其他加密模式。 加解密的流程总结: 0. 确认加密模式、ECB、CBC等 1. key,看是否需要sha.

Max's Note 6528

知识图谱与人工智能本体论:构建机器认知的语义基石

本文探讨了知识图谱与人工智能本体论如何作为机器认知的语义基石,让AI从‘知道数据’迈向‘理解知识’。文章详细拆解了本体论的核心构件与构建方法,并阐述了从本体到知识图谱的实践路径,包括知识获取、融合、存储及推理应用,最终分析了其在智能搜索与专家系统等场景中带来的根本性重塑。

nginx7reverse的博客 910

小样本物体检测

Few-Shot Object Detection with Attention-RPN and Multi-Relation Detector 关键:提出了一个小样本数据集:数据集 步骤: 提取support img为一过滤特征 使用support img的特征来过滤query img,最后将过滤后的特征输入RPN网络中 RPN网络层的输出,会进行多头判断,使用全局信息检测,使用局部信息检测,一对多检测 Attention-Based Region Proposal Network Increme

qq_21157073的博客 5266

Python中AES-SHA1PRNG加密方案解析与实践

对称加密算法AES(Advanced Encryption Standard)是当前最广泛使用的加密标准之一,配合伪随机数生成器SHA1PRNG可构建跨语言兼容的加密方案。其核心原理是通过SHA1哈希函数派生密钥,再采用AES的ECB模式进行数据加密。这种组合虽然存在安全性争议,但在金融数据脱敏、物联网通信等需要与Java等遗留系统交互的场景中仍具实用价值。工程实践中需特别注意密钥管理、IV生成和加密模式选择,通过添加盐值、使用CBC/GCM模式、结合HMAC校验等措施可显著提升安全性。对于现代系统,推荐采

weixin_27875131的博客 147

使用Simulink设计并实现一个可调谐的二阶IIR陷波滤波器,实时去除音频中的工频噪声

《基于Simulink的音频陷波滤波器设计与实现》摘要:本文详细介绍了使用Simulink设计陷波滤波器去除音频工频噪声(如50Hz)的方法。核心内容包括:1)二阶IIR陷波滤波器的原理与传递函数;2)Simulink实现步骤(音频系统搭建、滤波器设计、频率跟踪);3)性能分析(频谱对比、时域波形、听觉测试)。通过精准消除特定频率干扰,同时保留语音信号(200Hz-4kHz),有效提升信噪比(>20dB)。文章还探讨了多陷波级联、自适应算法等高级技巧,为音频处理、语音通信等应用提供实用解决方案。

amy_mhd的博客 154

python aes_java python AES 加密 对比

importbase64importhashlibfrom Crypto.Cipher importAES as _AESclassAES:def __init__(self, key: str):"""Init aes object used by encrypt or decrypt.AES/ECB/PKCS5Padding same as aes in java default."""se...

weixin_39795325的博客 293

虚拟机安装VMware Tools

单击虚拟机-->安装VMware Tool 安装之后会有一个VMware Tools硬盘,里面有VMware Tools.tar.gz的压缩包 按照提示解压它,然后执行vmware-install.pl安装VMware Tools 将安装包放到/tmp目录下。可以直接拽过去,也可以使用cp或者mv命令 进入tmp文件目录并解压此文件包 cd /tmp ...

afei001 620

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Python3和java互通的AES加密算法

参考文章: https://www.cnblogs.com/linuxcat/p/14494630.html https://www.cnblogs.com/niuu/p/10107212.html https://blog.youkuaiyun.com/u012119316/article/details/111193890 python环境 python3.7.5 安装包: pip install pycryptodome 很重要 python版本的算法有个问题,就是不能加密中文 代码 from Crypto

Fuly的博客 947

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

python aes java_【笔记】java与python AES解密代码对比

importbase64importhashlibfrom Crypto.Cipher importAES as _AESclassAES:def __init__(self, key: str):"""Init aes object used by encrypt or decrypt.AES/ECB/PKCS5Padding same as aes in java default."""se...

weixin_29800319的博客 186

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

跨语言AES加解密兼容:Python与Java密钥生成实战解析

AES加解密作为应用最广泛的对称加密算法,在不同编程语言间的实现本质一致,但跨语言对接时却常因密钥生成方式不同而失败。Java生态中常见的SHA1PRNG伪随机数生成器配合固定种子派生密钥的方法,在Python标准库中难以复现,导致同一字符串种子无法得到相同密钥。理解密钥派生原理是解决兼容问题的关键。aes-sha1prng作为专为此场景设计的Python库,完整实现了Java SHA1PRNG密钥展开逻辑,让Python能够从相同种子生成一致密钥,从而无缝对接Java老系统的AES/ECB/PKCS5Pa

weixin_29325955的博客 267

Python解密Java AES密文:aes-sha1prng跨语言加解密实战指南

对称加密是保障数据安全的基础技术,AES作为最主流的对称加密算法,广泛应用于接口传输、数据库字段加密等场景。但在跨语言工程实践中,Java与Python的AES实现并非天然互通,尤其在密钥派生环节,Java老系统常基于SHA1PRNG伪随机数生成器配合密码种子来生成密钥,这种逻辑在Python标准库中并无对应实现。针对此类兼容痛点,aes-sha1prng包通过复刻SHA1PRNG的确定性密钥派生过程,并复用pycryptodome的AES加解密能力,为Python开发者提供了一套简洁的适配方案。文章围绕该

weixin_33563728的博客 200

Python与Java AES加密联调不再难:aes-sha1prng兼容包解析与应用

在跨语言加密联调中,AES算法本身是国际标准,但不同技术栈的密钥派生方式却可能截然不同。Java体系常见的SHA1PRNG密钥生成机制,基于SHA-1哈希构造确定性伪随机流,只要种子一致,输出的密钥字节就完全一致。然而Python标准库没有原生对应实现,导致两边明明都叫AES,却解不出对方密文。理解这一原理后,可以通过兼容层工具aes-sha1prng在Python侧复刻Java的密钥派生逻辑,并配合CBC/ECB模式、PKCS7填充、Base64传输等参数约定,实现跨语言加解密无缝互操作。这一方案尤其适用

weixin_33646989的博客 194

java aes 中文_从Java到Python的AES加密

我试图对python和java中的一些字符串进行加密和解密,反之亦然,但是当我尝试用java加密和在python中使用相同的密钥解密时,我遇到了问题。在这是我用来解密java输出的python算法from hashlib import pbkdf2_hmacfrom Crypto.Cipher import AESsalt = bytes({0xC7, 0xB5, 0x99, 0xF4, 0x4B...

weixin_29858113的博客 350

PYTHON 使用DES 算法实现 与JAVA的加解密

JAVA实现: import sun.misc.BASE64Encoder; import javax.crypto.*; import javax.crypto.spec.SecretKeySpec; import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.secur.

nunuDD的博客 2008

JAVA AES/ECB/PKCS7Padding 转 python / python AES/ECB/PKCS7Padding解码

JAVA AES/ECB/PKCS7Padding 转 python 我这里有个需求,需要将 AES/ECB 加密过的的密文进行解密,我这里也有公钥,由于需要将项目进行对接,所以我选择用python进行解密,但在网上搜索出来发现大都不可用,或者无法运行,我用的的是python3.7 寻求大佬帮助。 另外一种方法是从之前别人写的java 的 AES/ECB 解密代码(试过可以运行成功,并且可以解码成功)我想将它转为python,但发现能力不够,也一直不成功。 下面是公司里别人用java写的解密代码 pack

qq_44256320的博客 739

Java对称加密工具类:AES/DES封装与最佳实践

对称加密是数据安全领域的核心技术,它使用同一密钥进行加密和解密,具有速度快、效率高的特点,广泛应用于数据传输、存储保护等场景。其原理基于分组密码算法,通过加密模式、填充方案和初始化向量等机制确保安全性。在Java开发中,JCA提供了加密基础,但直接使用较为繁琐。本文聚焦于AES和DES算法的工程实践,通过封装工具类简化开发流程,自动处理密钥管理、IV生成和编码转换等关键环节。该工具类支持CBC和GCM模式,集成PBKDF2密钥派生,并提供Spring Boot集成方案,帮助开发者快速实现安全可靠的加密功能,

weixin_33797791的博客 346

python代码转java工具_求大神将以下java代码转换成python代码

[Java] 纯文本查看 复制代码import sun.misc.BASE64Decoder;import sun.misc.BASE64Encoder;import javax.crypto.*;import javax.crypto.spec.SecretKeySpec;import java.io.IOException;import java.io.UnsupportedEncodingE...

weixin_39640444的博客 372

Apache Doris Java UDF 实战:基于 AES 实现自定义加解密函数

本指南以 Apache Doris 仓库中 [samples/doris-demo/java-udf-aes-demo](https://link.gitcode.com/i/6614466962bf8d576cab10878e4f0117) 示例为核心,完整讲解如何用 Java 编写、编译、注册并运行一个 AES 加解密 UDF(用户自定义函数)。读完本文,你将掌握 `CREATE FUNCTI

gitblog_00911的博客 342
上一篇: Python - RC4 算法
下一篇: Jmeter入门10 - Java Request
max229max
博客等级 码龄19年 88粉丝 122原创
评论 30
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值