# Sandra
![logo](https://user-images.githubusercontent.com/26662104/234409378-4602ff85-8fb1-425d-9213-979876c78dcc.png)
**Sandra implements CFB and [OpenPGP-CFB](https://datatracker.ietf.org/doc/html/rfc4880) built on top of pycryptodome.**
## Usage
### Loading Data
```python
Sandra.load_data(
path # str -> path to data to be loaded
)
```
### Writing Data
```python
Sandra.write_data(
file_names, # name of files to be written
file_data, # data to be written, must be the same length as file_names
path='.' # path to write data to
)
```
## Examples
### RSA File Encryption
```python
import Sandra
file_names, file_data = Sandra.load_data('./taylor_txt/taylor_swift_1KB.txt')
enc_dec_rsa = Sandra.RSA(2048, Sandra.RSA_ENGINE_DOME)
ciphertext = enc_dec_rsa.encrypt(file_data[0])
print(len(ciphertext))
plaintext = enc_dec_rsa.decrypt(ciphertext)
print(plaintext == file_data[0])
Sandra.write_data(
file_names, # name of the file to be written
[plaintext], # data to be written, must be the same length as file_names
path='./taylor_txt_ed' # path to write data to
)
```
### AES CFB Mode Sample(NIST) Encryption
```python
import Sandra
#Test Case from http://csrc.nist.gov/groups/STM/cavp/block-ciphers.html#aes
data = bytes.fromhex('fffffe00000000000000000000000000')
iv = bytes.fromhex('fffffe00000000000000000000000000')
key = bytes.fromhex('00000000000000000000000000000000')
enc_dec_sandra = Sandra.AES(key, Sandra.MODE_CFB, iv, segment_size=16)
ciphertext = enc_dec_sandra.encrypt(data)
plaintext = enc_dec_sandra.decrypt(ciphertext)
```
### AES CFB Mode File Encryption
```python
import Sandra
iv = bytes.fromhex('fffffe00000000000000000000000000')
key = bytes.fromhex('00000000000000000000000000000000')
file_names, file_data = Sandra.load_data('./taylor_txt/taylor_swift_1KB.txt')
enc_dec_cfb = Sandra.AES(key, Sandra.MODE_CFB, iv, segment_size=16)
ciphertext = enc_dec_cfb.encrypt(file_data[0])
print(len(ciphertext))
plaintext = enc_dec_cfb.decrypt(ciphertext)
print(plaintext == file_data[0])
Sandra.write_data(
file_names, # name of the file to be written
[plaintext], # data to be written, must be same length as file_names
path='./taylor_txt_ed' # path to write data to
)
```
### AES OpenPGP-CFB Mode File Encryption
> In This mode, the first 18 bytes of cipher text contain the encrypted IV
> Padding here is unnecessary as this mode is a stream cipher
```python
import Sandra
iv = bytes.fromhex('fffffe00000000000000000000000000')
key = bytes.fromhex('00000000000000000000000000000000')
file_names, file_data = Sandra.load_data('./taylor_txt/taylor_swift_1KB.txt')
print(len(file_data[0]))
file_data_padded = Sandra.pad(file_data, Sandra.AES_BLOCK_SIZE)
print(len(file_data_padded[0]))
enc_dec_pgp = Sandra.AES(key, Sandra.MODE_OPENPGP, iv)
ciphertext = enc_dec_pgp.encrypt(file_data_padded[0])
eiv, ciphertext = ciphertext[:18], ciphertext[18:]
print(len(ciphertext))
plaintext = enc_dec_pgp.decrypt(ciphertext)
print(len(plaintext))
plaintext = Sandra.unpad(plaintext,Sandra.AES_BLOCK_SIZE)
print(len(plaintext))
print(plaintext == file_data[0])
Sandra.write_data(
file_names, # name of the file to be written
[plaintext], # data to be written, must be the same length as file_names
path='./taylor_txt_ed' # path to write data to
)
```
## Performance
To obtain a table like this one, run
```python
import Sandra
file_names, file_data = Sandra.load_data('path/to/data')
stats = Sandra.performance_test(
file_names,
file_data,
rsa_key_size=256,
rsa_engine=Sandra.RSA_ENGINE_RAW,
segment_size=64,
verbose=True)
stats = Sandra.performance_test(
file_names,
file_data,
rsa_key_size=256,
rsa_engine=Sandra.RSA_ENGINE_RAW,
segment_size=16,
verbose=True)
```
![image](https://user-images.githubusercontent.com/26662104/236880905-4862877c-1fec-4662-831a-a8cdd5781a2d.png)
Raw data
{
"_id": null,
"home_page": "https://github.com/lopgogo/Sandra",
"name": "Sandra",
"maintainer": "",
"docs_url": null,
"requires_python": "",
"maintainer_email": "",
"keywords": "python,encryption,decryption,cipher,cryptography",
"author": "George Assaad",
"author_email": "<lopgogo@gmail.com>",
"download_url": "https://files.pythonhosted.org/packages/c8/cb/6bd4fbebeefe44c15a1455b75182ae8dd88fe57ad06f1336a3b298fabb9c/Sandra-0.0.18.tar.gz",
"platform": null,
"description": "\n# Sandra\n\n![logo](https://user-images.githubusercontent.com/26662104/234409378-4602ff85-8fb1-425d-9213-979876c78dcc.png)\n\n\n\n**Sandra implements CFB and [OpenPGP-CFB](https://datatracker.ietf.org/doc/html/rfc4880) built on top of pycryptodome.**\n\n\n\n## Usage\n\n### Loading Data\n\n```python\n\nSandra.load_data(\n\n path # str -> path to data to be loaded\n\n)\n\n```\n\n### Writing Data\n\n ```python\n\nSandra.write_data(\n\n file_names, # name of files to be written\n\n file_data, # data to be written, must be the same length as file_names\n\n path='.' # path to write data to\n\n)\n\n```\n\n\n\n## Examples\n\n### RSA File Encryption \n\n```python\n\nimport Sandra\n\nfile_names, file_data = Sandra.load_data('./taylor_txt/taylor_swift_1KB.txt') \n\nenc_dec_rsa = Sandra.RSA(2048, Sandra.RSA_ENGINE_DOME)\n\nciphertext = enc_dec_rsa.encrypt(file_data[0])\n\nprint(len(ciphertext))\n\nplaintext = enc_dec_rsa.decrypt(ciphertext)\n\nprint(plaintext == file_data[0])\n\nSandra.write_data(\n\n file_names, # name of the file to be written\n\n [plaintext], # data to be written, must be the same length as file_names\n\n path='./taylor_txt_ed' # path to write data to\n\n)\n\n```\n\n\n\n### AES CFB Mode Sample(NIST) Encryption\n\n```python\n\nimport Sandra\n\n#Test Case from http://csrc.nist.gov/groups/STM/cavp/block-ciphers.html#aes\n\ndata = bytes.fromhex('fffffe00000000000000000000000000')\n\niv = bytes.fromhex('fffffe00000000000000000000000000')\n\nkey = bytes.fromhex('00000000000000000000000000000000')\n\n\n\nenc_dec_sandra = Sandra.AES(key, Sandra.MODE_CFB, iv, segment_size=16)\n\nciphertext = enc_dec_sandra.encrypt(data)\n\nplaintext = enc_dec_sandra.decrypt(ciphertext)\n\n```\n\n\n\n### AES CFB Mode File Encryption\n\n```python\n\nimport Sandra\n\niv = bytes.fromhex('fffffe00000000000000000000000000')\n\nkey = bytes.fromhex('00000000000000000000000000000000')\n\nfile_names, file_data = Sandra.load_data('./taylor_txt/taylor_swift_1KB.txt') \n\nenc_dec_cfb = Sandra.AES(key, Sandra.MODE_CFB, iv, segment_size=16)\n\nciphertext = enc_dec_cfb.encrypt(file_data[0])\n\nprint(len(ciphertext))\n\nplaintext = enc_dec_cfb.decrypt(ciphertext)\n\nprint(plaintext == file_data[0])\n\nSandra.write_data(\n\n file_names, # name of the file to be written\n\n [plaintext], # data to be written, must be same length as file_names\n\n path='./taylor_txt_ed' # path to write data to\n\n)\n\n```\n\n\n\n### AES OpenPGP-CFB Mode File Encryption\n\n> In This mode, the first 18 bytes of cipher text contain the encrypted IV\n\n> Padding here is unnecessary as this mode is a stream cipher\n\n```python\n\nimport Sandra\n\niv = bytes.fromhex('fffffe00000000000000000000000000')\n\nkey = bytes.fromhex('00000000000000000000000000000000')\n\nfile_names, file_data = Sandra.load_data('./taylor_txt/taylor_swift_1KB.txt')\n\nprint(len(file_data[0]))\n\nfile_data_padded = Sandra.pad(file_data, Sandra.AES_BLOCK_SIZE) \n\nprint(len(file_data_padded[0]))\n\nenc_dec_pgp = Sandra.AES(key, Sandra.MODE_OPENPGP, iv)\n\nciphertext = enc_dec_pgp.encrypt(file_data_padded[0])\n\neiv, ciphertext = ciphertext[:18], ciphertext[18:]\n\nprint(len(ciphertext))\n\nplaintext = enc_dec_pgp.decrypt(ciphertext)\n\nprint(len(plaintext))\n\nplaintext = Sandra.unpad(plaintext,Sandra.AES_BLOCK_SIZE)\n\nprint(len(plaintext))\n\nprint(plaintext == file_data[0])\n\nSandra.write_data(\n\n file_names, # name of the file to be written\n\n [plaintext], # data to be written, must be the same length as file_names\n\n path='./taylor_txt_ed' # path to write data to\n\n)\n\n```\n\n\n\n## Performance\n\nTo obtain a table like this one, run \n\n```python\n\nimport Sandra\n\nfile_names, file_data = Sandra.load_data('path/to/data')\n\nstats = Sandra.performance_test(\n\n file_names, \n\n file_data, \n\n rsa_key_size=256,\n\n rsa_engine=Sandra.RSA_ENGINE_RAW,\n\n segment_size=64, \n\n verbose=True)\n\n\n\nstats = Sandra.performance_test(\n\n file_names, \n\n file_data, \n\n rsa_key_size=256,\n\n rsa_engine=Sandra.RSA_ENGINE_RAW,\n\n segment_size=16, \n\n verbose=True)\n\n```\n\n![image](https://user-images.githubusercontent.com/26662104/236880905-4862877c-1fec-4662-831a-a8cdd5781a2d.png)\n\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "AES Stream Cipher with CFB and OpenPGP Modes",
"version": "0.0.18",
"project_urls": {
"Homepage": "https://github.com/lopgogo/Sandra"
},
"split_keywords": [
"python",
"encryption",
"decryption",
"cipher",
"cryptography"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "531abe3eb4e4de3b84abb88394123dfef05df8ddb54f3a33d09ac62cfa47f292",
"md5": "e34918ec774d6f74ae8a51b7643cc520",
"sha256": "6d7eeb8f9d5abf1a8fe6b50de236f6eca0376850ffdd0e980dc73219b6860576"
},
"downloads": -1,
"filename": "Sandra-0.0.18-py3-none-any.whl",
"has_sig": false,
"md5_digest": "e34918ec774d6f74ae8a51b7643cc520",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 8088,
"upload_time": "2023-05-08T18:46:51",
"upload_time_iso_8601": "2023-05-08T18:46:51.036148Z",
"url": "https://files.pythonhosted.org/packages/53/1a/be3eb4e4de3b84abb88394123dfef05df8ddb54f3a33d09ac62cfa47f292/Sandra-0.0.18-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "c8cb6bd4fbebeefe44c15a1455b75182ae8dd88fe57ad06f1336a3b298fabb9c",
"md5": "8d938c7ef06e67145e20774c643ebe4c",
"sha256": "17ef99ad9c0b3fb23e90ae5a1d2dbf901b48967418d11ca7db0202b1b41e6921"
},
"downloads": -1,
"filename": "Sandra-0.0.18.tar.gz",
"has_sig": false,
"md5_digest": "8d938c7ef06e67145e20774c643ebe4c",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 8396,
"upload_time": "2023-05-08T18:46:56",
"upload_time_iso_8601": "2023-05-08T18:46:56.788706Z",
"url": "https://files.pythonhosted.org/packages/c8/cb/6bd4fbebeefe44c15a1455b75182ae8dd88fe57ad06f1336a3b298fabb9c/Sandra-0.0.18.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-05-08 18:46:56",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "lopgogo",
"github_project": "Sandra",
"github_not_found": true,
"lcname": "sandra"
}