Skip to content

Commit 108deda

Browse files
author
Vic May
committed
added two PGP encrypt/decrypt scripts for testing
1 parent eb6e1b5 commit 108deda

File tree

5 files changed

+143
-0
lines changed

5 files changed

+143
-0
lines changed

encrypted.bin

316 Bytes
Binary file not shown.

pgp_decrypt.tcl

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
# Usage: tclsh pgp_decrypt.tcl privkey.pem infile.bin
2+
3+
if {[llength $argv] != 2} {
4+
puts "Usage: tclsh pgp_decrypt.tcl privkey.pem infile.bin"
5+
exit 1
6+
}
7+
set privfile [lindex $argv 0]
8+
set infile [lindex $argv 1]
9+
10+
# Load ToSSL
11+
if {[catch {package require tossl}]} {
12+
load ./libtossl.so
13+
}
14+
15+
# Read the private key
16+
set f [open $privfile r]
17+
set priv [read $f]
18+
close $f
19+
20+
# Read the encrypted file
21+
set f [open $infile rb]
22+
fconfigure $f -translation binary
23+
set raw [read $f]
24+
close $f
25+
26+
# Check file length
27+
if {[string length $raw] < 12} {
28+
puts stderr "Error: Encrypted file is too short or corrupt."
29+
exit 2
30+
}
31+
32+
# Parse lengths (big-endian 4 bytes each)
33+
set n [binary scan $raw "cccccccccccc" k1 k2 k3 k4 i1 i2 i3 i4 c1 c2 c3 c4]
34+
if {$n != 12} {
35+
puts stderr "Error: Failed to parse length headers from encrypted file."
36+
exit 2
37+
}
38+
set keylen [expr {($k1<<24)|($k2<<16)|($k3<<8)|($k4&0xff)}]
39+
set ivlen [expr {($i1<<24)|($i2<<16)|($i3<<8)|($i4&0xff)}]
40+
set ctlen [expr {($c1<<24)|($c2<<16)|($c3<<8)|($c4&0xff)}]
41+
42+
set offset 12
43+
set wrapped_key [string range $raw $offset [expr {$offset+$keylen-1}]]
44+
set offset [expr {$offset+$keylen}]
45+
set aes_iv [string range $raw $offset [expr {$offset+$ivlen-1}]]
46+
set offset [expr {$offset+$ivlen}]
47+
set ciphertext [string range $raw $offset [expr {$offset+$ctlen-1}]]
48+
49+
if {[string length $wrapped_key] != $keylen || [string length $aes_iv] != $ivlen || [string length $ciphertext] != $ctlen} {
50+
puts stderr "Error: Encrypted file is truncated or corrupt (bad lengths)."
51+
exit 2
52+
}
53+
54+
# Decrypt AES key
55+
set aes_key [tossl::rsa::decrypt -privkey $priv $wrapped_key]
56+
# Decrypt message
57+
set message [tossl::decrypt -alg aes-128-cbc -key $aes_key -iv $aes_iv $ciphertext]
58+
59+
puts "Decrypted message: $message"

pgp_encrypt.tcl

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# Usage: tclsh pgp_encrypt.tcl pubkey.pem "Secret message" outfile.bin
2+
3+
if {[llength $argv] != 3} {
4+
puts "Usage: tclsh pgp_encrypt.tcl pubkey.pem \"message\" outfile.bin"
5+
exit 1
6+
}
7+
set pubfile [lindex $argv 0]
8+
set message [lindex $argv 1]
9+
set outfile [lindex $argv 2]
10+
11+
# Load ToSSL
12+
if {[catch {package require tossl}]} {
13+
load ./libtossl.so
14+
}
15+
16+
# Read the public key
17+
set f [open $pubfile r]
18+
set pub [read $f]
19+
close $f
20+
21+
# Generate random AES key and IV
22+
set aes_key [tossl::randbytes 16]
23+
set aes_iv [tossl::randbytes 16]
24+
25+
# Encrypt the message
26+
set ciphertext [tossl::encrypt -alg aes-128-cbc -key $aes_key -iv $aes_iv $message]
27+
set wrapped_key [tossl::rsa::encrypt -pubkey $pub $aes_key]
28+
29+
# Write lengths and data to outfile (format: keylen, ivlen, ctlen, then each blob)
30+
set f [open $outfile wb]
31+
# Write lengths as 4 bytes each, big-endian
32+
set lengths [list [string length $wrapped_key] [string length $aes_iv] [string length $ciphertext]]
33+
foreach val $lengths {
34+
puts -nonewline $f [binary format "cccc" \
35+
[expr {($val>>24)&0xff}] \
36+
[expr {($val>>16)&0xff}] \
37+
[expr {($val>>8)&0xff}] \
38+
[expr {$val&0xff}]]
39+
}
40+
puts -nonewline $f $wrapped_key
41+
puts -nonewline $f $aes_iv
42+
puts -nonewline $f $ciphertext
43+
close $f
44+
45+
puts "Encrypted message written to $outfile"

privkey.pem

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
-----BEGIN PRIVATE KEY-----
2+
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDTKrJr5Bxobptn
3+
pwId6+ClBp/a3sCp0aElfsD0KmwvvfK5s7eBXo5/+ie7ey2SP7RExkQC1zhGLzqY
4+
wUKwEUynytAS/KYPyI+J1pNDMquUHolMG7IGUA/NAahY5i6pY0XfVURMZeby2Scq
5+
w+ZeEoyhpZACd25vJE//bYQnY2QKcikJBtWW0k4iII+3HfkEU+dF51P7Zgg/lxCN
6+
z47uppjRbVhsSlQ0Ldip+XRgKsvYT5NBHPydsOSalvP3g9BDgJzoK77UqRlSx7ad
7+
1c5BVgqADKwFQ0NTNNgFXAJ4988f+63ExvmGcouWm8JiPD3IgMzwa7iH1Mv9lF1u
8+
gQZzBwGBAgMBAAECggEAIhg7PaNTmOL+8YHsHBOpLkv/BHJBzkl8CNdJ5UJyPFUh
9+
ey1SvC8dt/kWcDVnurzRaOdQNNs2CVL31ZEiqNXqOA9NgDtNvq+lyV4dYdStElnJ
10+
1kGEgXNs0a9qVIw5zXyrW+9i+yja3KwGIGgH6nl5PmJCebt517UXu4idtVRdYzgX
11+
ZaymaJvcESe8AOM0mL828AezUTKHCSKx3qfMCCVz/gxia70NWn6xRxJwrSQ4Q0bE
12+
dirgZtc8dVjQL2ta4AK6KbOqYptk9FTwl4QSekn4+3M0A5GwTW+MUnIs2KdXQOvd
13+
6ViBpqQS1uW+aX0lZLWJwfoaiGqx5L4XHsMnr/8cNwKBgQDqa9RLnekMUotZhz5U
14+
X/0xPhAdoxySTV76mNuOwzGCOA9IJ+AIsp/6N8+cOGsjUI/6n1SahZWkLFxh9FB/
15+
Pmg0lo+5p/lYVgVL1rP9Pwe9Q+jXnhHDVdspRg2IdP1WJsYrwVq0lBROX4OoRz8v
16+
kzkIL0Q5WiqXv6nJF+aw0c25twKBgQDmmt+s443gDtpQy+obaEijZV488KKVLPRb
17+
W8tT0aowXWIqP2uDtKYm+5ZkoYPwlvcW7xiOwvek6jZS3NpyptL+O8RlgVHPb/IX
18+
chCgmhIgcXHzR3JwAc4z6Bim37I751C0fL3WL9ZoNQkkosuht6WaQkO0rlra5ePP
19+
BbsFSu5+hwKBgQCZVfcDj0MFYGjuItzObAs9zo7UFAF4YUujN6FF/L/BodG9LPgK
20+
OG0USrVuRikubGABW38HpCGBxdKX8CtHUBbxbxqMIiejdID6XnJVUIlLb8Q6ZZbQ
21+
4rP8h2oKvBuJ4sr1jAA85i9yJGAGDrRx9ib0B5bkvOnnYOM6OnwXZOTgeQKBgQDc
22+
hTfmbcjLfYiaARYDVYs47YPbxMXE37Ng9fwPUI1uKK7p9bHLxeGpn6cm3il81fC9
23+
trEGPD1zMCH4xYgEYbGdOuxJoQvp0YRxlTt/STaSXcn5Odaec6uLiaShV4Nqs35C
24+
ypMDEsX26tiudxtBr4umYz25t43cjEB4RWOd4RUGWwKBgDMLs8GP2y0kCIk1SlGR
25+
BDOw8dtSkfPyJ5kGnGevTb0GihArTa36VQ19yd7zaySpwD4dy0LiDMoRFaAcOeQr
26+
tozihMn09JF24tp+FPIYNrRqaWbCli08Ffgpel10U0A8ZKgyknGODAicAnXQaYus
27+
xDYb1QygjT1CuKbEHCWBfb8t
28+
-----END PRIVATE KEY-----
29+

pubkey.pem

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
-----BEGIN PUBLIC KEY-----
2+
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0yqya+QcaG6bZ6cCHevg
3+
pQaf2t7AqdGhJX7A9CpsL73yubO3gV6Of/onu3stkj+0RMZEAtc4Ri86mMFCsBFM
4+
p8rQEvymD8iPidaTQzKrlB6JTBuyBlAPzQGoWOYuqWNF31VETGXm8tknKsPmXhKM
5+
oaWQAndubyRP/22EJ2NkCnIpCQbVltJOIiCPtx35BFPnRedT+2YIP5cQjc+O7qaY
6+
0W1YbEpUNC3Yqfl0YCrL2E+TQRz8nbDkmpbz94PQQ4Cc6Cu+1KkZUse2ndXOQVYK
7+
gAysBUNDUzTYBVwCePfPH/utxMb5hnKLlpvCYjw9yIDM8Gu4h9TL/ZRdboEGcwcB
8+
gQIDAQAB
9+
-----END PUBLIC KEY-----
10+

0 commit comments

Comments
 (0)