Stefan Claas <
pollux@tilde.club> wrote:
Rich wrote:
Stefan Claas <pollux@tilde.club> wrote:
Rich wrote:
If instead you mean some kind of "special, PNG aware, encryptor that
only encrypted the bitmap data of a PNG", but left the file as
otherwise a proper PNG image structure, then that is slightly tricky
(and an algorithm that is only useful for PNG's alone).
Yes, this is what I mean.
Which brings up the question of: why?
Why go to the trouble to create an encryptor that is specalized for
just encrypting the internal bitmap data within a PNG, leaving the rest
as a PNG file, when a generic "byte stream" encryptor will encrypt the
entire PNG with no extra effort?
To make more content as allowed postable on social media, like X.
Ah, because the intermediate pipe is not transparent, and essentially
does the equivalent of 'file post.png' and disallows posting of
"post.png" files that do not return as "post.png: PNG image data, ...".
In which case, you would 'simplify' your 'image encryptor' if it
instead encrypted NetPBM [1] images, and relied upon the NetPBM tools
to convert the result to a PNG (or a GIF, or a 'whatever'). A NetPBM
image is a very short ASCII text header, followed by the raw binary
bitmap data (there is even an older ASCII bitmap data format for NetPBM
if you wanted to use that).
Then, you need:
1) a generic binary encryptor/decryptor
2) a very small utility to wrap/unwrap a NetPBM header onto the binary
data (you would take care of padding to/from a "rectangle" the
binary data here)
3) the NetPBM tools to convert to/from other image formats for actual
posting
I.e., here's a very small (10x10) PNG (created with GIMP, I used
exiftool to remove the 'created with GIMP' comment):
$ ls -l sc.png
-rw-r--r-- 1 110 Jan 5 11:20 sc.png
Here's the xxd encoded version:
$ xxd sc.png
00000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452 .PNG........IHDR
00000010: 0000 000a 0000 000a 0802 0000 0002 5058 ..............PX
00000020: ea00 0000 0970 4859 7300 002e 2300 002e .....pHYs...#...
00000030: 2301 78a5 3f76 0000 0007 7449 4d45 07e9 #.x.?v....tIME..
00000040: 0105 1013 3242 3f8a 0a00 0000 0d49 4441 ....2B?......IDA
00000050: 5418 d363 6018 05a4 0300 0136 0001 1ad5 T..c`......6....
00000060: 8d17 0000 0000 4945 4e44 ae42 6082 ......IEND.B`.
Convert it to pnm:
$ pngtopam sc.png > sc.ppm
Here is what 'file' reports:
$ file sc.ppm
sc.ppm: Netpbm image data, size = 10 x 10, rawbits, pixmap
And the file is this ASCII header:
P6
10 10
255
followed by 298 ASCII null bytes:
$ xxd sc.ppm
00000000: 5036 0a31 3020 3130 0a32 3535 0a00 0000 P6.10 10.255....
00000010: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000020: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000030: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000040: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000050: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000060: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000070: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000080: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000090: 0000 0000 0000 0000 0000 0000 0000 0000 ................
000000a0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
000000b0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
000000c0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
000000d0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
000000e0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
000000f0: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000100: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000110: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000120: 0000 0000 0000 0000 0000 0000 0000 0000 ................
00000130: 0000 0000 0000 0000 00 .........
It is trivial to "replace" the binary part of the ppm file above with
an encrypted version thereof. Then the 'pamtopng' tool from NetPBM can
be used to convert the 'replaced' image back into a PNG (or GIF or TIFF
or one of numerous other formats, using other pamto or pnmto
converters).
[1]
https://netpbm.sourceforge.net/Note, I've used the Unix CLI tools above for ease of demonstration
purposes. NetPBM is also a library, so you very well may have a go
module for NetPBM available, where you can perform these transforms
from within go by calling the netpbm library rather than needing the
CLI toolset installed.