运行环境:python 3.6

依赖包Crypto的安装: pip3 install pycryptodome

# Make coding more python3-ish
from __future__ import (absolute_import, division, print_function)from abc import ABCMeta
from array import array
from base64 import b64encode, b64decode
from Crypto import Random
from Crypto.Cipher import AES
from Crypto.Hash import SHA256class PBEParameterGenerator(object):__metaclass__ = ABCMeta@staticmethoddef pad(block_size, s):"""Pad a string to the provided block size when using fixed block ciphers.:param block_size: int - the cipher block size:param s: str - the string to pad:return: a padded string that can be fed to the cipher"""return s + (block_size - len(s) % block_size) * chr(block_size - len(s) % block_size)@staticmethoddef unpad(s):"""Remove padding from the string after decryption when using fixed block ciphers.:param s: str - the string to remove padding from:return: the unpadded string"""s = s.decode('utf-8')s = s[0:-ord(s[-1])]# return s[0:-ord(s[-1])]return s.encode('utf-8')@staticmethoddef adjust(a, a_off, b):"""Adjusts the byte array as per PKCS12 spec:param a: byte[] - the target array:param a_off: int - offset to operate on:param b: byte[] - the bitsy array to pick from:return: nothing as operating on array by reference"""x = (b[len(b) - 1] & 0xff) + (a[a_off + len(b) - 1] & 0xff) + 1a[a_off + len(b) - 1] = x & 0xffx = x >> 8for i in range(len(b) - 2, -1, -1):x = x + (b[i] & 0xff) + (a[a_off + i] & 0xff)a[a_off + i] = x & 0xffx = x >> 8@staticmethoddef pkcs12_password_to_bytes(password):"""Converts a password string to a PKCS12 v1.0 compliant byte array.:param password: byte[] - the password as simple string:return: The unsigned byte array holding the password"""pkcs12_pwd = [0x00] * (len(password) + 1) * 2for i in range(0, len(password)):digit = ord(password[i])pkcs12_pwd[i * 2] = int(digit >> 8)pkcs12_pwd[i * 2 + 1] = int(digit)return array('B', pkcs12_pwd)class PKCS12ParameterGenerator(PBEParameterGenerator):"""Equivalent of the Bouncycastle PKCS12ParameterGenerator."""__metaclass__ = ABCMetaKEY_MATERIAL = 1IV_MATERIAL = 2MAC_MATERIAL = 3SALT_SIZE_BYTE = 16def __init__(self, digest_factory):super(PBEParameterGenerator, self).__init__()self.digest_factory = digest_factorydef generate_derived_parameters(self, password, salt, iterations, key_size, iv_size):"""Generates the key and iv that can be used with the cipher.:param password: str - the password used for the key material:param salt: byte[] - random salt:param iterations: int - number if hash iterations for key material:param key_size: int - key size in bits:param iv_size: int - iv size in bits:return: key and iv that can be used to setup the cipher"""key_size = int(key_size / 8)iv_size = int(iv_size / 8)# pkcs12 padded password (unicode byte array with 2 trailing 0x0 bytes)password_bytes = PKCS12ParameterGenerator.pkcs12_password_to_bytes(password)d_key = self.generate_derived_key(password_bytes, salt, iterations, self.KEY_MATERIAL, key_size)if iv_size and iv_size > 0:d_iv = self.generate_derived_key(password_bytes, salt, iterations, self.IV_MATERIAL, iv_size)else:d_iv = Nonereturn d_key, d_ivdef generate_derived_key(self, password, salt, iterations, id_byte, key_size):"""Generate a derived key as per PKCS12 v1.0 spec:param password: byte[] - pkcs12 padded password (unicode byte array with 2 trailing 0x0 bytes):param salt: byte[] - random salt:param iterations: int - number if hash iterations for key material:param id_byte: int - the material padding:param key_size: int - the key size in bytes (e.g. AES is 256/8 = 32, IV is 128/8 = 16):return: the sha256 digested pkcs12 key"""u = int(self.digest_factory.digest_size)v = int(self.digest_factory.block_size)d_key = [0x00] * key_size# Step 1D = [id_byte] * v# Step 2S = []if salt and len(salt) != 0:s_size = v * int((len(salt) + v - 1) / v)S = [0x00] * s_sizesalt_size = len(salt)for i in range(s_size):S[i] = salt[i % salt_size]# Step 3P = []if password and len(password) != 0:p_size = v * int((len(password) + v - 1) / v)P = [0x00] * p_sizepassword_size = len(password)for i in range(p_size):P[i] = password[i % password_size]# Step 4I = array('B', S + P)B = array('B', [0x00] * v)# Step 5c = int((key_size + u - 1) / u)# Step 6for i in range(1, c + 1):# Step 6 - adigest = self.digest_factory.new()digest.update(array('B', D))digest.update(I)A = array('B', digest.digest())  # bouncycastle now resets the digest, we will create a new digestfor j in range(1, iterations):A = array('B', self.digest_factory.new(A).digest())# Step 6 - bfor k in range(0, v):B[k] = A[k % u]# Step 6 - cfor j in range(0, int(len(I) / v)):self.adjust(I, j * v, B)if i == c:for j in range(0, key_size - ((i - 1) * u)):d_key[(i - 1) * u + j] = A[j]else:for j in range(0, u):d_key[(i - 1) * u + j] = A[j]return array('B', d_key)def encrypt(password, text, iterations=1000):# some default from somewherekey_size_bits = 256iv_size_bits = 128# create sha256 PKCS12 secret generatorgenerator = PKCS12ParameterGenerator(SHA256)# from PBE.Util.makePBEParameters()# generate a 16 byte salt which is used to generate key material and ivsalt = array('B', Random.get_random_bytes(PKCS12ParameterGenerator.SALT_SIZE_BYTE))# print('enc-salt = %s' % binascii.hexlify(salt))# generate key material as per PBEWITHSHA256AND256BITAES-CBC-BCkey, iv = generator.generate_derived_parameters(password, salt, iterations, key_size_bits, iv_size_bits)# setup AES ciphercipher = AES.new(key.tobytes(), AES.MODE_CBC, iv.tobytes())# pad the plain text secret to AES block sizeencrypted_message = cipher.encrypt(generator.pad(AES.block_size, text))# concatenate salt + encrypted messagereturn b64encode(salt + array('B', encrypted_message))def decrypt(password, ciphertext, iterations=1000):# some default from somewherekey_size_bits = 256iv_size_bits = 128# create sha256 PKCS12 secret generatorgenerator = PKCS12ParameterGenerator(SHA256)# decode the base64 encoded and encrypted secretn_cipher_bytes = b64decode(ciphertext)# extract salt bytes 0 - SALT_SIZEsalt = array('B', n_cipher_bytes[:PKCS12ParameterGenerator.SALT_SIZE_BYTE])# print('dec-salt = %s' % binascii.hexlify(salt))# create reverse key materialkey, iv = generator.generate_derived_parameters(password, salt, iterations, key_size_bits, iv_size_bits)cipher = AES.new(key.tobytes(), AES.MODE_CBC, iv.tobytes())# extract encrypted message bytes SALT_SIZE - len(cipher)n_cipher_message = array('B', n_cipher_bytes[PKCS12ParameterGenerator.SALT_SIZE_BYTE:])# decode the message and unpaddecoded = cipher.decrypt(n_cipher_message.tostring())return generator.unpad(decoded)if __name__ == "__main__":passcode = 'pssst...don\'t tell anyone'result = encrypt(passcode, 'secret value', 4000)print('enc = %s' % result)reverse = decrypt(passcode, result, 4000)print('dec = %s' % reverse)# run something like this on the jasypt command line# $JASYPT_HOME/bin/decrypt.sh keyObtentionIterations = 4000 \#                             providerClassName = "org.bouncycastle.jce.provider.BouncyCastleProvider" \#                             saltGeneratorClassName = "org.jasypt.salt.RandomSaltGenerator" \#                             algorithm = "PBEWITHSHA256AND256BITAES-CBC-BC" \#                             password = 'pssst...don\'t tell anyone' \#                             input = 'xgX5+yRbKhs4zSubkAPkg9gSBkZU6XWt7csceM/3xDY='

python 复现java中jasypt包的 PBEWITHSHA256AND256BITAES-CBC-BC加解密算法(可java python双向加解密)相关推荐

  1. java中怎样存储遍历的数据_【数据算法】Java实现二叉树存储以及遍历

    二叉树在java中我们使用数组的形式保存原数据,这个数组作为二叉树的数据来源,后续对数组中的数据进行节点化操作. 步骤就是原数据:数组 节点化数据:定义 Node节点对象 存储节点对象:通过Linke ...

  2. Java中的包(package)详情解释

    一.Java 包(package) 为了更好地组织类,Java 提供了包机制,用于区别类名的命名空间. 包的作用 1.把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用. 2.如同文件夹一 ...

  3. Java中jar包怎么使用_java中jar包的使用方法

    java中jar包的使用方法 发布时间:2020-06-23 11:08:05 来源:亿速云 阅读:162 作者:Leah 这篇文章将为大家详细讲解有关java中jar包的使用方法,小编觉得挺实用的, ...

  4. 用java实现4种加密解密算法(包括:换位加密解密、替换加密解密、位加密解密、一次一密)

    案例1: 换位加密解密算法 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamR ...

  5. 【JAVA系列】Java中的包、类的继承、多态、抽象类与接口

    文章目录 前言 一.包及访问权限 1.什么是包? 2.如何导入包? 3.JDK中常见的包 4.包的访问控制权限 二.继承 1.继承的基本概念 2.继承时方法调用顺序 3.super和this关键字 4 ...

  6. Java中的包,类的导入,静态导入

    包的作用 1. 为了更好的组织代码,能够将自己的代码与代码库的代码分离. 2. 在需要合作完成的工作中,可以使用分包的方式来尽量的减少类命名的冲突. Sun公司推荐程序员使用公司域名的反向字符作为公司 ...

  7. java中不同包中怎么实例化,Java 笔试题 (01)

    Java 笔试题 1.有1.2.3.4.5个数字,能组成多少个互不相同且无重复数字的四位数?都是多少? 提示:可填在千位.百位.十位.个位的数字都是1.2.3.4.5.组成所有的排列后再去 掉不满足条 ...

  8. 【Java学习笔记四】Java中的包

    包的声明和引入:在Java语言系统中,Java编译器为每一个类生成一个字节码文件(.class),为了对类文件进行分层和按用途分类管理,同时也为了解决相同类名的文件冲突的问题,Java提供了包机制来管 ...

  9. java中jar包怎么下载

    Java中时常会需要导入一些jar包来支持代码的编译运行,但是很多时候我们不知道该怎么去下载jar包,接下来我给大家说说(本人亲身经历,苦不堪言555555~) 我说的情况是,你的代码中有些impor ...

最新文章

  1. ECSHOP商品编辑器上传中文名图片产生乱码
  2. 距离QCon纽约还有3个礼拜:新的演讲、播客节目和研讨会
  3. 防火墙认证的类型——Vecloud
  4. Broadcom NetXtrem II网卡Linux安装指南(转载)
  5. Linux下为iptables增加layer7补丁(Linux2.6.25内核)
  6. 问题:python3关于json文件多余一行后发生的错误
  7. kotlin之重载运算符(十一)
  8. 人类心理学中几乎没有人知道的东西是什么?
  9. Solr7.2.1环境搭建和配置ik中文分词器
  10. rabbitmq 客户端golang实战
  11. MATLAB 滤波函数的源代码
  12. 金蝶服务器选项没有账套信息,金蝶财务软件帐套属性设置保存和帐套启用报错的解决方法...
  13. wps多出来的页面怎么办?wps怎么删除不要的页
  14. 关于拉格朗日中值定理在高考中使用严谨性的问题
  15. 最全的熬粥方法Word计算机考试怎么做,各种粥的做法大全Word文档.doc
  16. 高性能JSON框架之FastJson的简单使用
  17. 在祝贺提拔的饭局上当众敬酒,别说“感谢领导”,高手都懂这4点
  18. Spring中的applicationContext.xml与SpringMVC的xxx-servl
  19. 【玩转ms17-010】mysql数据库-脱裤实践
  20. 祝各位SAPER元旦快乐!

热门文章

  1. 人工智能不仅玩坏了一只猫,还玩坏了整个简笔画
  2. D3D11计算着色器配置与编程
  3. 华为第三代5G手机 Mate40吊打苹果
  4. java-net-php-python-jspm网上商城计算机毕业设计程序
  5. csgo服务器搭建(linux)-织音云
  6. ABP开发框架前后端开发系列——框架的总体介绍
  7. java 滚动加载_滚动加载 - java-苦苦甜甜的个人空间 - OSCHINA - 中文开源技术交流社区...
  8. error Component name “xxx“ should always be multi-word vue/multi-word-comp
  9. Java 远程控制全实现:高效解决远程控制场景,附代码示例
  10. Tank:如果我变成回忆