#!/usr/bin/env python3 """ 2PAC — Steganography Tool Hide secret data inside images. Extract hidden data from images. Usage: python 2pac.py hide --image photo.png --data "secret message" --output out.png python 2pac.py extract --image out.png --password hunter2 """ import argparse import os import sys from steg_embedder import StegEmbedder from dct_steg import DctStegEmbedder def cmd_hide(args): output = args.output or os.path.splitext(args.image)[0] + '_stego.png' if args.dct: embedder = DctStegEmbedder(quality=args.quality) success, msg, stats = embedder.embed_data( args.image, args.data, output, password=args.password ) else: embedder = StegEmbedder() success, msg, stats = embedder.embed_data( args.image, args.data, output, password=args.password, bits_per_channel=args.bits ) print(msg) if success: print(f"Output: {output}") print(f"Stats: {stats}") return 0 if success else 1 def cmd_extract(args): if args.dct: embedder = DctStegEmbedder() success, msg, data = embedder.extract_data( args.image, password=args.password ) else: embedder = StegEmbedder() success, msg, data = embedder.extract_data( args.image, password=args.password, bits_per_channel=args.bits ) print(msg) if success: print(data) return 0 if success else 1 def main(): parser = argparse.ArgumentParser( prog='2pac', description='2PAC — Hide data inside images, or extract hidden data.', ) sub = parser.add_subparsers(dest='command', required=True) p_hide = sub.add_parser('hide', help='Hide data inside an image') p_hide.add_argument('--image', required=True, help='Input image path') p_hide.add_argument('--data', required=True, help='Text to hide') p_hide.add_argument('--output', help='Output path (default: _stego.png)') p_hide.add_argument('--password', help='Encryption password') p_hide.add_argument('--dct', action='store_true', help='Use DCT (experimental, lower capacity)') p_hide.add_argument('--bits', type=int, default=1, help='LSB bits per channel 1-4 (default: 1)') p_hide.add_argument('--quality', type=int, default=95, help='DCT quality (default: 95)') p_ext = sub.add_parser('extract', help='Extract hidden data from an image') p_ext.add_argument('--image', required=True, help='Image to extract from') p_ext.add_argument('--password', help='Decryption password') p_ext.add_argument('--dct', action='store_true', help='DCT extraction (default: LSB)') p_ext.add_argument('--bits', type=int, default=1, help='LSB bits per channel (default: 1)') args = parser.parse_args() if args.command == 'hide': return cmd_hide(args) elif args.command == 'extract': return cmd_extract(args) if __name__ == '__main__': sys.exit(main())