transcrypto 1.6.0__py3-none-any.whl → 1.7.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- transcrypto/__init__.py +7 -0
- transcrypto/aes.py +150 -44
- transcrypto/base.py +587 -442
- transcrypto/constants.py +20070 -1906
- transcrypto/dsa.py +132 -99
- transcrypto/elgamal.py +116 -84
- transcrypto/modmath.py +88 -78
- transcrypto/profiler.py +225 -175
- transcrypto/rsa.py +126 -90
- transcrypto/sss.py +122 -70
- transcrypto/transcrypto.py +2361 -1419
- {transcrypto-1.6.0.dist-info → transcrypto-1.7.0.dist-info}/METADATA +78 -58
- transcrypto-1.7.0.dist-info/RECORD +17 -0
- {transcrypto-1.6.0.dist-info → transcrypto-1.7.0.dist-info}/WHEEL +1 -2
- transcrypto-1.7.0.dist-info/entry_points.txt +4 -0
- transcrypto/safetrans.py +0 -1228
- transcrypto-1.6.0.dist-info/RECORD +0 -18
- transcrypto-1.6.0.dist-info/top_level.txt +0 -1
- {transcrypto-1.6.0.dist-info → transcrypto-1.7.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,20 +1,31 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: transcrypto
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.7.0
|
|
4
4
|
Summary: Basic crypto primitives, not intended for actual use, but as a companion to --Criptografia, Métodos e Algoritmos--
|
|
5
|
-
Author-email: Daniel Balparda <balparda@github.com>
|
|
6
5
|
License-Expression: Apache-2.0
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
License-File: LICENSE
|
|
7
|
+
Keywords: cryptography,validation,encryption,signing,random-generation,prime-numbers,aes-encryption,decryption,rsa-cryptography,elgamal-encryption,dsa-algorithm,modular-mathematics,rsa,dsa,elgamal,aes,python,poetry,typer,rich,cli
|
|
8
|
+
Author: Daniel Balparda
|
|
9
|
+
Author-email: balparda@github.com
|
|
10
|
+
Requires-Python: >=3.13
|
|
9
11
|
Classifier: Programming Language :: Python :: 3
|
|
10
12
|
Classifier: Programming Language :: Python :: 3.13
|
|
11
13
|
Classifier: Operating System :: OS Independent
|
|
12
14
|
Classifier: Topic :: Utilities
|
|
13
15
|
Classifier: Topic :: Security :: Cryptography
|
|
14
|
-
Requires-
|
|
16
|
+
Requires-Dist: cryptography (>=46.0)
|
|
17
|
+
Requires-Dist: gmpy2 (>=2.2)
|
|
18
|
+
Requires-Dist: platformdirs (>=4.5)
|
|
19
|
+
Requires-Dist: rich (>=14.3)
|
|
20
|
+
Requires-Dist: scipy (>=1.17)
|
|
21
|
+
Requires-Dist: typer (>=0.21)
|
|
22
|
+
Requires-Dist: zstandard (>=0.25)
|
|
23
|
+
Project-URL: Changelog, https://github.com/balparda/transcrypto/blob/main/CHANGELOG.md
|
|
24
|
+
Project-URL: Homepage, https://github.com/balparda/transcrypto
|
|
25
|
+
Project-URL: Issues, https://github.com/balparda/transcrypto/issues
|
|
26
|
+
Project-URL: PyPI, https://pypi.org/project/transcrypto/
|
|
27
|
+
Project-URL: Repository, https://github.com/balparda/transcrypto
|
|
15
28
|
Description-Content-Type: text/markdown
|
|
16
|
-
License-File: LICENSE
|
|
17
|
-
Dynamic: license-file
|
|
18
29
|
|
|
19
30
|
# TransCrypto
|
|
20
31
|
|
|
@@ -76,7 +87,7 @@ Started in July/2025, by Daniel Balparda. Since version 1.0.2 it is PyPI package
|
|
|
76
87
|
|
|
77
88
|
## License
|
|
78
89
|
|
|
79
|
-
Copyright
|
|
90
|
+
Copyright 2026 Daniel Balparda <balparda@github.com>
|
|
80
91
|
|
|
81
92
|
Licensed under the ***Apache License, Version 2.0*** (the "License"); you may not use this file except in compliance with the License. You may obtain a [copy of the License here](http://www.apache.org/licenses/LICENSE-2.0).
|
|
82
93
|
|
|
@@ -94,7 +105,6 @@ All that being said, extreme care was taken that this is a good library with a s
|
|
|
94
105
|
|
|
95
106
|
## CLI Apps
|
|
96
107
|
|
|
97
|
-
- [SafeTrans/`safetrans`](safetrans.md): Safe cryptographic operations;
|
|
98
108
|
- [TransCrypto/`transcrypto`](transcrypto.md): Does all the operations but allows you to shoot yourself in the foot;
|
|
99
109
|
- [Profiler/`profiler`](profiler.md): Measure transcrypto performance.
|
|
100
110
|
|
|
@@ -122,14 +132,18 @@ Known dependencies:
|
|
|
122
132
|
#### Humanized Sizes (IEC binary)
|
|
123
133
|
|
|
124
134
|
```py
|
|
125
|
-
from transcrypto import
|
|
135
|
+
from transcrypto import base
|
|
126
136
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
137
|
+
base.HumanizedBytes(512) # '512 B'
|
|
138
|
+
base.HumanizedBytes(2048) # '2.000 KiB'
|
|
139
|
+
base.HumanizedBytes(5 * 1024**3) # '5.000 GiB'
|
|
130
140
|
```
|
|
131
141
|
|
|
132
|
-
Converts raw byte counts to binary-prefixed strings (`B`, `KiB`, `MiB`, `GiB`, `TiB`, `PiB`, `EiB`).
|
|
142
|
+
Converts raw byte counts to binary-prefixed strings (`B`, `KiB`, `MiB`, `GiB`, `TiB`, `PiB`, `EiB`).
|
|
143
|
+
|
|
144
|
+
- For integer inputs `<1024`, returns an integer count with `B` (e.g. `'512 B'`).
|
|
145
|
+
- For float inputs `<1024`, returns 3 decimals with `B` (e.g. `'51.200 B'`).
|
|
146
|
+
- For values `≥1024`, returns 3 decimals.
|
|
133
147
|
|
|
134
148
|
- standard: 1 KiB = 1024 B, 1 MiB = 1024 KiB, …
|
|
135
149
|
- errors: negative inputs raise `InputError`
|
|
@@ -138,43 +152,47 @@ Converts raw byte counts to binary-prefixed strings (`B`, `KiB`, `MiB`, `GiB`, `
|
|
|
138
152
|
|
|
139
153
|
```py
|
|
140
154
|
# Base (unitless)
|
|
141
|
-
|
|
142
|
-
|
|
155
|
+
base.HumanizedDecimal(950) # '950'
|
|
156
|
+
base.HumanizedDecimal(1500) # '1.500 k'
|
|
143
157
|
|
|
144
158
|
# With a unit (trimmed and attached)
|
|
145
|
-
|
|
146
|
-
|
|
159
|
+
base.HumanizedDecimal(1500, unit=' Hz ') # '1.500 kHz'
|
|
160
|
+
base.HumanizedDecimal(0.123456, unit='V') # '123.456 mV'
|
|
147
161
|
|
|
148
162
|
# Large magnitudes
|
|
149
|
-
|
|
150
|
-
|
|
163
|
+
base.HumanizedDecimal(3_200_000) # '3.200 M'
|
|
164
|
+
base.HumanizedDecimal(7.2e12, unit='B/s') # '7.200 TB/s'
|
|
151
165
|
```
|
|
152
166
|
|
|
153
|
-
Scales by powers of 1000 using SI prefixes
|
|
167
|
+
Scales by powers of 1000 using SI prefixes to keep the displayed value in roughly `[1, 1000)` when possible.
|
|
168
|
+
|
|
169
|
+
- Supported large prefixes: `k`, `M`, `G`, `T`, `P`, `E`
|
|
170
|
+
- Supported small prefixes: `m`, `µ`, `n`, `p`, `f`, `a`
|
|
171
|
+
- Formatting uses 3 decimals for non-integer/unscaled values and for scaled values.
|
|
154
172
|
|
|
155
173
|
- unit handling: `unit` is stripped; `<1000` values include a space before the unit (`'950 Hz'`)
|
|
156
|
-
- errors:
|
|
174
|
+
- errors: non-finite inputs raise `InputError` (negative values are supported and keep a leading `-`)
|
|
157
175
|
|
|
158
176
|
#### Humanized Durations
|
|
159
177
|
|
|
160
178
|
```py
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
179
|
+
base.HumanizedSeconds(0) # '0.000 s'
|
|
180
|
+
base.HumanizedSeconds(0.000004) # '4.000 µs'
|
|
181
|
+
base.HumanizedSeconds(0.25) # '250.000 ms'
|
|
182
|
+
base.HumanizedSeconds(42) # '42.000 s'
|
|
183
|
+
base.HumanizedSeconds(3661) # '1.017 h'
|
|
184
|
+
base.HumanizedSeconds(172800) # '2.000 d'
|
|
167
185
|
```
|
|
168
186
|
|
|
169
187
|
Chooses an appropriate time unit based on magnitude and formats with fixed precision:
|
|
170
188
|
|
|
171
189
|
- `< 1 ms`: microseconds with three decimals (`µs`)
|
|
172
190
|
- `< 1 s`: milliseconds with three decimals (`ms`)
|
|
173
|
-
- `< 60 s`: seconds with
|
|
174
|
-
- `< 60 min`: minutes with
|
|
175
|
-
- `< 24 h`: hours with
|
|
176
|
-
- `≥ 24 h`: days with
|
|
177
|
-
- special case: `0 → '0.
|
|
191
|
+
- `< 60 s`: seconds with three decimals (`s`)
|
|
192
|
+
- `< 60 min`: minutes with three decimals (`min`)
|
|
193
|
+
- `< 24 h`: hours with three decimals (`h`)
|
|
194
|
+
- `≥ 24 h`: days with three decimals (`d`)
|
|
195
|
+
- special case: `0 → '0.000 s'`
|
|
178
196
|
- errors: negative or non-finite inputs raise `InputError`
|
|
179
197
|
|
|
180
198
|
#### Execution Timing
|
|
@@ -191,7 +209,7 @@ import time
|
|
|
191
209
|
```py
|
|
192
210
|
with base.Timer('Block timing'):
|
|
193
211
|
time.sleep(1.2)
|
|
194
|
-
# → logs: "Block timing: 1.
|
|
212
|
+
# → logs: "Block timing: 1.200 s" (default via logging.info)
|
|
195
213
|
```
|
|
196
214
|
|
|
197
215
|
Starts timing on entry, stops on exit, and reports elapsed time automatically.
|
|
@@ -204,7 +222,7 @@ def slow_function():
|
|
|
204
222
|
time.sleep(0.8)
|
|
205
223
|
|
|
206
224
|
slow_function()
|
|
207
|
-
# → logs: "Function timing: 0.
|
|
225
|
+
# → logs: "Function timing: 0.800 s"
|
|
208
226
|
```
|
|
209
227
|
|
|
210
228
|
Wraps a function so that each call is automatically timed.
|
|
@@ -215,17 +233,17 @@ Wraps a function so that each call is automatically timed.
|
|
|
215
233
|
tm = base.Timer('Inline timing', emit_print=True)
|
|
216
234
|
tm.Start()
|
|
217
235
|
time.sleep(0.1)
|
|
218
|
-
tm.Stop() # prints: "Inline timing: 0.
|
|
236
|
+
tm.Stop() # prints: "Inline timing: 0.100 s"
|
|
219
237
|
```
|
|
220
238
|
|
|
221
239
|
Manual control over `Start()` and `Stop()` for precise measurement of custom intervals.
|
|
222
240
|
|
|
223
241
|
##### Key points
|
|
224
242
|
|
|
225
|
-
- **Label**:
|
|
243
|
+
- **Label**: optional; if empty, output omits the label prefix
|
|
226
244
|
- **Output**:
|
|
227
245
|
- `emit_log=True` → `logging.info()` (default)
|
|
228
|
-
- `emit_print=True` →
|
|
246
|
+
- `emit_print=True` → prints via `rich.console.Console().print()`
|
|
229
247
|
- Both can be enabled
|
|
230
248
|
- **Format**: elapsed time is shown using `HumanizedSeconds()`
|
|
231
249
|
- **Safety**:
|
|
@@ -253,7 +271,7 @@ blob = base.Serialize(data)
|
|
|
253
271
|
blob = base.Serialize(
|
|
254
272
|
data,
|
|
255
273
|
compress=9, # compression level (-22..22, default=3)
|
|
256
|
-
key=
|
|
274
|
+
key=my_encryptor # must implement `base.Encryptor` (e.g., `aes.AESKey`)
|
|
257
275
|
)
|
|
258
276
|
|
|
259
277
|
# Save directly to file
|
|
@@ -297,7 +315,7 @@ obj = base.DeSerialize(data=blob)
|
|
|
297
315
|
obj = base.DeSerialize(file_path='/tmp/data.blob')
|
|
298
316
|
|
|
299
317
|
# With decryption
|
|
300
|
-
obj = base.DeSerialize(data=blob, key=
|
|
318
|
+
obj = base.DeSerialize(data=blob, key=my_decryptor)
|
|
301
319
|
```
|
|
302
320
|
|
|
303
321
|
Deserialization path:
|
|
@@ -313,7 +331,8 @@ data/file → (decrypt) → (decompress if Zstd) → unpickle
|
|
|
313
331
|
|
|
314
332
|
- Exactly one of `data` or `file_path` must be provided.
|
|
315
333
|
- `file_path` must exist; `data` must be at least 4 bytes.
|
|
316
|
-
- Wrong key
|
|
334
|
+
- Wrong key / authentication failure can raise `CryptoError`.
|
|
335
|
+
- Corrupted compressed blobs typically raise `zstandard.ZstdError` during decompression.
|
|
317
336
|
|
|
318
337
|
#### Cryptographically Secure Randomness
|
|
319
338
|
|
|
@@ -388,8 +407,8 @@ The function is `O(log(min(a, b)))` and handles arbitrarily large integers. To f
|
|
|
388
407
|
|
|
389
408
|
```py
|
|
390
409
|
>>> base.ExtendedGCD(462, 1071)
|
|
391
|
-
(21,
|
|
392
|
-
>>> 462 *
|
|
410
|
+
(21, 7, -3)
|
|
411
|
+
>>> 462 * 7 + 1071 * (-3)
|
|
393
412
|
21
|
|
394
413
|
```
|
|
395
414
|
|
|
@@ -535,13 +554,13 @@ Hashes a file from disk in streaming mode. By default uses SHA-256; `digest='sha
|
|
|
535
554
|
|
|
536
555
|
#### Symmetric Encryption Interface
|
|
537
556
|
|
|
538
|
-
`
|
|
557
|
+
`base.Encryptor` and `base.Decryptor` are runtime-checkable protocols that define the **byte-in / byte-out** contract for symmetric ciphers.
|
|
539
558
|
|
|
540
559
|
- **Metadata handling** — if the algorithm uses a `nonce` or `tag`, the implementation must handle it internally (e.g., append it to ciphertext).
|
|
541
560
|
- **AEAD modes** — if supported, `associated_data` must be authenticated; otherwise, a non-`None` value should raise `InputError`.
|
|
542
561
|
|
|
543
562
|
```py
|
|
544
|
-
class MyAES(base.
|
|
563
|
+
class MyAES(base.Encryptor, base.Decryptor):
|
|
545
564
|
def Encrypt(self, plaintext: bytes, *, associated_data=None) -> bytes:
|
|
546
565
|
...
|
|
547
566
|
def Decrypt(self, ciphertext: bytes, *, associated_data=None) -> bytes:
|
|
@@ -555,8 +574,8 @@ Cryptographic objects all derive from the `CryptoKey` class and will all have so
|
|
|
555
574
|
- Will be safe to log and print, i.e., implement safe `__str__()` and `__repr__()` methods (in actuality `repr` will be exactly the same as `str`). The `__str__()` should always fully print the public parts of the object and obfuscate the private ones. This obfuscation allows for some debugging, if needed, but if the secrets are "too short" then it can be defeated by brute force. For usual crypto defaults the obfuscation is fine. The obfuscation is the fist 4 bytes of the SHA-512 for the value followed by an ellipsis (e.g. `c9626f16…`).
|
|
556
575
|
- It will have a `_DebugDump()` method that **does print secrets** and can be used for **debugging only**.
|
|
557
576
|
- Can be easily serialized to `bytes` by the `blob` property and to base-64 encoded `str` by the `encoded` property.
|
|
558
|
-
- Can be serialized encrypted to `bytes` by the `Blob(key=[
|
|
559
|
-
- Can be instantiated back as an object from `str` or `bytes` using the `Load(data, key=[
|
|
577
|
+
- Can be serialized encrypted to `bytes` by the `Blob(key=[base.Encryptor])` method and to encrypted base-64 encoded `str` by the `Encoded(key=[base.Encryptor])` method.
|
|
578
|
+
- Can be instantiated back as an object from `str` or `bytes` using the `Load(data, key=[base.Decryptor] | None)` method. The `Load()` will decide how to build the object and will work universally with all the serialization options discussed above.
|
|
560
579
|
|
|
561
580
|
Example:
|
|
562
581
|
|
|
@@ -719,7 +738,7 @@ For real-world deployments, use a high-level library with authenticated encrypti
|
|
|
719
738
|
from transcrypto import elgamal
|
|
720
739
|
|
|
721
740
|
# Shared parameters (prime modulus, group base) for a group
|
|
722
|
-
shared = elgamal.ElGamalSharedPublicKey.
|
|
741
|
+
shared = elgamal.ElGamalSharedPublicKey.NewShared(256)
|
|
723
742
|
print(shared.prime_modulus)
|
|
724
743
|
print(shared.group_base)
|
|
725
744
|
|
|
@@ -771,8 +790,8 @@ This is **raw DSA** over a prime field — **no hashing or padding**. You sign/v
|
|
|
771
790
|
```py
|
|
772
791
|
from transcrypto import dsa
|
|
773
792
|
|
|
774
|
-
# Shared parameters (p, q, g)
|
|
775
|
-
shared = dsa.DSASharedPublicKey.
|
|
793
|
+
# Shared parameters (p, q, g) - Safe Sign/Verify requires q > 512 bits
|
|
794
|
+
shared = dsa.DSASharedPublicKey.NewShared(2048, 520)
|
|
776
795
|
print(shared.prime_modulus) # p
|
|
777
796
|
print(shared.prime_seed) # q (q | p-1)
|
|
778
797
|
print(shared.group_base) # g
|
|
@@ -808,11 +827,11 @@ assert pub.RawVerify(msg, sig)
|
|
|
808
827
|
|
|
809
828
|
```py
|
|
810
829
|
# Generate primes (p, q) with q | (p-1); also returns m = (p-1)//q
|
|
811
|
-
p, q, m = dsa.NBitRandomDSAPrimes(
|
|
830
|
+
p, q, m = dsa.NBitRandomDSAPrimes(1024, 160)
|
|
812
831
|
assert (p - 1) % q == 0
|
|
813
832
|
```
|
|
814
833
|
|
|
815
|
-
Used internally by `DSASharedPublicKey.
|
|
834
|
+
Used internally by `DSASharedPublicKey.NewShared()`.
|
|
816
835
|
Search breadth and retry caps are bounded; repeated failures raise `CryptoError`.
|
|
817
836
|
|
|
818
837
|
#### Public Bidding
|
|
@@ -837,14 +856,14 @@ print(bid_pub == bid_pub_expected)
|
|
|
837
856
|
|
|
838
857
|
<https://en.wikipedia.org/wiki/Shamir's_secret_sharing>
|
|
839
858
|
|
|
840
|
-
This is the information-theoretic SSS but with no authentication or binding between share and secret. Malicious share injection is possible! Add MAC or digital signature in hostile settings. Use at least 128-bit modulus for non-toy deployments.
|
|
859
|
+
This is the information-theoretic SSS but with no authentication or binding between share and secret. Malicious share injection is possible! Add MAC or digital signature in hostile settings. Use at least 128-bit modulus for non-toy deployments; `MakeDataShares()` requires > 256 bits.
|
|
841
860
|
|
|
842
861
|
```py
|
|
843
862
|
from transcrypto import sss
|
|
844
863
|
|
|
845
864
|
# Generate parameters: at least 3 of 5 shares needed,
|
|
846
|
-
# coefficients & modulus are
|
|
847
|
-
priv = sss.ShamirSharedSecretPrivate.New(
|
|
865
|
+
# coefficients & modulus are 264-bit primes (> 256 bits required for MakeDataShares)
|
|
866
|
+
priv = sss.ShamirSharedSecretPrivate.New(3, 264)
|
|
848
867
|
pub = sss.ShamirSharedSecretPublic.Copy(priv) # what you publish
|
|
849
868
|
|
|
850
869
|
print(f'threshold : {pub.minimum}')
|
|
@@ -874,8 +893,8 @@ A single share object looks like `sss.ShamirSharePrivate(minimum=3, modulus=...,
|
|
|
874
893
|
# Safe Re-constructing the secret
|
|
875
894
|
secret = b'xyz'
|
|
876
895
|
five_shares = priv.MakeDataShares(secret, 5)
|
|
877
|
-
subset = five_shares[:3]
|
|
878
|
-
recovered = subset[0].RecoverData(subset)
|
|
896
|
+
subset = five_shares[:3] # any 3 distinct shares
|
|
897
|
+
recovered = subset[0].RecoverData(subset[1:]) # each share has the encrypted data, pass other shares
|
|
879
898
|
assert recovered == secret
|
|
880
899
|
|
|
881
900
|
# Raw Re-constructing the secret
|
|
@@ -1035,7 +1054,7 @@ poetry publish
|
|
|
1035
1054
|
If you changed the CLI interface at all, in any tool, run:
|
|
1036
1055
|
|
|
1037
1056
|
```sh
|
|
1038
|
-
|
|
1057
|
+
make docs
|
|
1039
1058
|
```
|
|
1040
1059
|
|
|
1041
1060
|
You can find the 10 top slowest tests by running:
|
|
@@ -1069,3 +1088,4 @@ $ deactivate
|
|
|
1069
1088
|
```
|
|
1070
1089
|
|
|
1071
1090
|
Hint: 85%+ is inside `MillerRabinIsPrime()`/`gmpy2.powmod()`...
|
|
1091
|
+
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
transcrypto/__init__.py,sha256=EgL-1w0DMlvXD3_aON4AJeBukDbBXhsMHwINtafJsgA,338
|
|
2
|
+
transcrypto/aes.py,sha256=Sgu02D_994B05dRiJfFy2lvbgWZdP2A9ivzMQntlm7g,14986
|
|
3
|
+
transcrypto/base.py,sha256=yZ95VgRFXkfWdzGygP1fN-sTTgzQ6uFsFJvPSXjzltI,63064
|
|
4
|
+
transcrypto/constants.py,sha256=qIdXZ90LYZdu5VZ_hKizU04j_wLA0Na0-mSUZ5pOdiY,191233
|
|
5
|
+
transcrypto/dsa.py,sha256=6FW9YtJxL77CZahZ9hIEeoA2imJ24yxK_oao-gOJTME,19933
|
|
6
|
+
transcrypto/elgamal.py,sha256=N-DB0m1BoOjxmqo-qeBTbBi9NPOCigCEJsh0bmcdYgM,20522
|
|
7
|
+
transcrypto/modmath.py,sha256=IwWHlTdCwq87xVcpwL8nbydvKjxgZe7hPTC9aKUF-Y4,21259
|
|
8
|
+
transcrypto/profiler.py,sha256=q5TA3uLpL5dPZEcTJDNBQIKbx513NvQWS3TK6Vug7oo,7287
|
|
9
|
+
transcrypto/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
10
|
+
transcrypto/rsa.py,sha256=0MmsfHNTOZKxmqq0LlezoBTs5VzWVrRHqp1oLaVSo2Q,24113
|
|
11
|
+
transcrypto/sss.py,sha256=5-U1aWEruJYdv3-4wWxT5_cs7PGaj27OD0eRYD_k7OY,16924
|
|
12
|
+
transcrypto/transcrypto.py,sha256=z6dQRSWJKTBmxVvrd0AUQnkhT6d9ho0vvLROCR8jDYs,83955
|
|
13
|
+
transcrypto-1.7.0.dist-info/METADATA,sha256=TRINhe2XXndRcg9LTq9M_EO5RL6Hp1lNCVtltcfgYT8,39000
|
|
14
|
+
transcrypto-1.7.0.dist-info/WHEEL,sha256=3ny-bZhpXrU6vSQ1UPG34FoxZBp3lVcvK0LkgUz6VLk,88
|
|
15
|
+
transcrypto-1.7.0.dist-info/entry_points.txt,sha256=HXJ1yXZJT_9OhLJgEhv2toOpxwhDaIU2HuW91MTJDIg,93
|
|
16
|
+
transcrypto-1.7.0.dist-info/licenses/LICENSE,sha256=DVQuDIgE45qn836wDaWnYhSdxoLXgpRRKH4RuTjpRZQ,10174
|
|
17
|
+
transcrypto-1.7.0.dist-info/RECORD,,
|