Skip to main content

sm crypto or more, cryptanalysis tools, toys

Project description

:warning: 警告

本项目仅作个人学习使用,不可用于生产环境,否则后果自负。

This library is only for learning purposes and can not be used in production environments. Otherwise, you will be at your own risk.

:memo: 可参考 tests 中的使用方法

Crypto

SM2

sign

SM2的裸签名,类似ECC,直接用这个签名不符合国标要求,除非自己特意构造的 data即e,没有预处理计算ZA操作,没有SM3,因为在底下的sm2_sm3中有,

sign(self, data: bytes, private_key: int, k: int | None = None)

verify

verify(self, signature: asn1_str, data: bytes, public_key: Tuple[int, int])

compute_ZA

compute_ZA(self, public_key: Tuple[int, int], ID: str | None = None)

sign_with_sm3

符合国标的签名 SM2真正的签名对象如下 tobesign = sm3.hash(ZA + data), ZA = compute_ZA(public_key, ID)

sign_with_sm3(self, data: bytes, private_key: int, public_key: Tuple[int, int], ID: str | None = None, randomk: int | None = None)

verify_with_sm3

verify_with_sm3(self, signature: asn1_str, data: bytes, public_key: Tuple[int, int], ID: str | None = None)

encrypt

encrypt(self, msg: bytes, public_key: Tuple[int, int], k: int | None = None)

decrypt

decrypt(self, cipher_txt: asn1_str, private_key: int)

recover_privateKey_by_kAndrs

已知秘密随机数k,一组r,s(即签名值),可恢复sm2私钥。

recover_privateKey_by_kAndrs(self, k: int, r: int, s: int)

recover_privateKey_by_fixedk_and_2rs

无需知道k的具体值,但知道k是固定值,通过两组rs(即签名值),可恢复sm2私钥。

recover_privateKey_by_fixedk_and_2rs(self, r1: int, s1: int, r2: int, s2: int)

recover_publicKeys_by_eAndrs

纯数学公式计算,知道一组签名值rs与e的值,可恢复公钥,满足条件的公钥可能存在多个。e可能是原消息m,或者是经过hash预处理的e,具体看怎么签的名

recover_publicKeys_by_eAndrs(self, e: int, r: int, s: int)

is_same_k

is_same_k(self, r1, e1, r2, e2)

recover_private_key_by_liner_k

如果k的随机性是线性的,k2 = ak1 + bG,且知道线性参数,可通过两组rs,恢复sm2私钥,故固定k是一种特殊情况

recover_private_key_by_liner_k(self, r1: int, s1: int, r2: int, s2: int, a: int, b: int)

forge_e_signature

纯数学公式计算,t是 r + s,伪造e的签名,说是伪造其实是恢复e而已,已知一组签名值rs及公钥,计算对哪个e进行签名。故可以随机产生一组r,s,然后计算得到一个e,使得验签通过

forge_e_signature(self, public_key: Tuple[int, int], s: int, t: int)

SM3

hash

sm3的hash方法,有点想把str输入移除了

hash(msg: bytes | str) -> bytes

SM4

纯SM4算法加解密实现,不涉及工作模式,所以不存在IV与Padding值 分组密码自身只能加密长度等于密码分组长度的单块数据

encrypt

encrypt(plaintext: bytes, key: bytes) -> bytes

decrypt

decrypt(cipher: bytes, key: bytes) -> bytes

utils

kdf

密钥派生函数

rotl

将x循环左移n位

rotl(x, n)

types

asn1_str = NewType("asn1_str", str)
base64_str = NewType("base64_str", str)
hex_str = NewType("hex_str", str)

TODO :dart:

  • sm2协同签名
  • CBC-MAC不定长攻击
  • M-D 结构 hash 长度拓展攻击
  • padding oracle 填充攻击

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

cryptanalysis_tools-0.1.2.tar.gz (20.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

cryptanalysis_tools-0.1.2-py3-none-any.whl (12.1 kB view details)

Uploaded Python 3

File details

Details for the file cryptanalysis_tools-0.1.2.tar.gz.

File metadata

  • Download URL: cryptanalysis_tools-0.1.2.tar.gz
  • Upload date:
  • Size: 20.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.7.20

File hashes

Hashes for cryptanalysis_tools-0.1.2.tar.gz
Algorithm Hash digest
SHA256 83ee73ec6138de8e7f727c2d9e7c80771e405f86eccd030a64e090d0bfc7ea90
MD5 5fc52f6468117a95bab20b8081d2ce81
BLAKE2b-256 b217f8f85b6bea8931611b5634e1ca50a4723517ec215550da445adcd6663042

See more details on using hashes here.

File details

Details for the file cryptanalysis_tools-0.1.2-py3-none-any.whl.

File metadata

File hashes

Hashes for cryptanalysis_tools-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 8f7013b3acdfaab40d5428be6683409b52915078425204bdfea7cabe56f5d89d
MD5 acc19edb69e77a4ede268420bd04b690
BLAKE2b-256 a20f87806cc16fe55035e91cb27da3d5d9412bdf049ed4f5d8536bb53116824c

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page