A C++20 implementation of the denisign algorithm for embedding ML-DSA signatures in JPEG images for non-repudiation cryptography and deniable steganography purposes.
Make sure you have libjpeg or libjpeg-turbo installed.
I recommend using libjpeg-turbo. Download and install it from here.
If you are using Jetbrains CLion, you can run denisign_native configuration instead, but you still have to make sure
to set the environment variable or the dynamic library of libjpeg might not be found.
On Linux,
#Specify libjpeg binaries location
export JPEG_ROOT="/find/where/your/libjpeg/is/installed/"
#Build static library
cmake --target denisignOn Windows CMD,
#Specify libjpeg binaries location
set JPEG_ROOT="/find/where/your/libjpeg/is/installed/"
#Build static library
cmake.exe --target denisignDefault Parameters:
- NDK 29.0.14033849
- Android API 24
- ABIs "arm64-v8a" "armeabi-v7a" "x86" "x86_64"
Requirements:
- CMake (Installed using Android Studio or with a standalone Android SDK).
- Android SDK path set to ANDROID_HOME system environment variable.
- Windows Subsystem for Linux (WSL).
Run ./wsl_build_android.sh using the WSL shell to build all the ABIs. The build outputs will be in androidLibs and
androidHeaders directories. Copy them to your Android JNI project.
If you want to change the NDK version, change the value set in the variable NDK_VERSION.
Default Parameters:
- NDK 29.0.14033849
- Android API 24
- ABIs arm64-v8a armeabi-v7a x86 x86_64
Requirements:
- CMake (Installed using Android Studio or with a standalone Android SDK).
- Android SDK path set to ANDROID_HOME system environment variable.
Run .\win_build_android.bat using the CMD shell to build all the ABIs. The build outputs will be in androidLibs and
androidHeaders directories. Copy them to your Android JNI project.
If you want to change the NDK version, change the value set in the variable NDK_VERSION.
If you are using Jetbrains CLion, you can run test_runner configuration instead, but you still have to make sure to
set the environment variable or the dynamic library of libjpeg might not be found.
On Linux,
#Specify libjpeg binaries location
export JPEG_ROOT="/find/where/your/libjpeg/is/installed/"
#Build executable
cmake --build ./cmake-build-debug --target test_runner
#Run executable
./cmake-build-debug/test_runnerOn Windows,
#Specify libjpeg binaries location
set JPEG_ROOT="/find/where/your/libjpeg/is/installed/"
#Build executable
cmake.exe --build ./cmake-build-debug --target test_runner
#Run executable
./cmake-build-debug/test_runner.exeMain contributor, project maintainer, and research lead for Denisign.
Contributor for get_ac and part of the research team for Denisign.
Contributor for retrieve_bytes and part of the research team for Denisign.
Contributor for embed_bytes and part of the research team for Denisign.
Solely for cjpeglib directory in this project attributed to Martin Benes from the University of Innsbruck and
doesn't apply to other parts of this project that use the code stored in that directory.
Denisign Algorithm to embed ML-DSA signatures into JPEG images using the MDE algorithm.
Copyright (C) 2025 Ron Lauren Hombre, Sander Melvert Gervacio, Reinier Anthony Casimiro, John Michael Almazan
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, see
<https://www.gnu.org/licenses/>.