{"id":569,"date":"2026-07-21T12:37:12","date_gmt":"2026-07-21T12:37:12","guid":{"rendered":"https:\/\/freewebtools.co.in\/?page_id=569"},"modified":"2026-07-21T14:34:47","modified_gmt":"2026-07-21T14:34:47","slug":"steg","status":"publish","type":"page","link":"https:\/\/freewebtools.co.in\/index.php\/steg\/","title":{"rendered":"Steganography"},"content":{"rendered":"\n<div class=\"steg_tool_wrapper\">\n    <style>\n        .steg_tool_wrapper {\n            font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif;\n            color: #1f2937;\n            background-color: #ffffff;\n            margin: 20px auto;\n            max-width: 700px;\n            width: 100%;\n            padding: 30px;\n            box-sizing: border-box;\n            border-radius: 12px;\n            box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);\n            border: 1px solid #e5e7eb;\n        }\n        .steg_tool_wrapper * {\n            box-sizing: border-box;\n        }\n        .steg_tool_wrapper h2 {\n            font-size: 1.75rem;\n            font-weight: 700;\n            margin-top: 0;\n            margin-bottom: 24px;\n            color: #111827;\n            text-align: center;\n        }\n        .steg_tool_wrapper .steg_section {\n            margin-bottom: 24px;\n        }\n        .steg_tool_wrapper h3 {\n            font-size: 1.15rem;\n            font-weight: 600;\n            margin-bottom: 12px;\n            color: #374151;\n        }\n        .steg_tool_wrapper label {\n            display: block;\n            font-weight: 500;\n            font-size: 0.9rem;\n            margin-bottom: 6px;\n            color: #4b5563;\n        }\n        .steg_tool_wrapper input[type=\"file\"] {\n            display: block;\n            width: 100%;\n            padding: 10px;\n            font-size: 0.9rem;\n            border: 1px solid #d1d5db;\n            border-radius: 8px;\n            background-color: #f9fafb;\n            margin-bottom: 16px;\n            cursor: pointer;\n        }\n        .steg_tool_wrapper textarea {\n            width: 100%;\n            padding: 12px;\n            font-size: 0.95rem;\n            border: 1px solid #d1d5db;\n            border-radius: 8px;\n            resize: vertical;\n            min-height: 90px;\n            margin-bottom: 16px;\n            font-family: inherit;\n        }\n        .steg_tool_wrapper textarea:focus,\n        .steg_tool_wrapper input[type=\"file\"]:focus {\n            outline: none;\n            border-color: #2563eb;\n            box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.15);\n        }\n        .steg_tool_wrapper .steg_btn_group {\n            display: flex;\n            gap: 10px;\n            flex-wrap: wrap;\n        }\n        .steg_tool_wrapper button {\n            padding: 10px 20px;\n            font-size: 0.95rem;\n            font-weight: 600;\n            border: none;\n            border-radius: 8px;\n            cursor: pointer;\n            transition: background-color 0.2s, transform 0.1s;\n        }\n        .steg_tool_wrapper button:active {\n            transform: scale(0.98);\n        }\n        .steg_tool_wrapper .steg_btn_primary {\n            background-color: #2563eb;\n            color: #ffffff;\n        }\n        .steg_tool_wrapper .steg_btn_primary:hover {\n            background-color: #1d4ed8;\n        }\n        .steg_tool_wrapper .steg_btn_secondary {\n            background-color: #6b7280;\n            color: #ffffff;\n        }\n        .steg_tool_wrapper .steg_btn_secondary:hover {\n            background-color: #4b5563;\n        }\n        .steg_tool_wrapper hr {\n            border: 0;\n            height: 1px;\n            background-color: #e5e7eb;\n            margin: 30px 0;\n        }\n        .steg_tool_wrapper .steg_alert {\n            padding: 12px 16px;\n            border-radius: 8px;\n            font-size: 0.9rem;\n            margin-top: 16px;\n            display: none;\n        }\n        .steg_tool_wrapper .steg_alert_success {\n            background-color: #ecfdf5;\n            color: #065f46;\n            border: 1px solid #a7f3d0;\n        }\n        .steg_tool_wrapper .steg_alert_error {\n            background-color: #fef2f2;\n            color: #991b1b;\n            border: 1px solid #fecaca;\n        }\n        .steg_tool_wrapper .steg_output_box {\n            margin-top: 12px;\n            padding: 12px;\n            background-color: #f3f4f6;\n            border-radius: 8px;\n            border: 1px solid #d1d5db;\n            font-family: monospace;\n            word-break: break-all;\n            white-space: pre-wrap;\n            min-height: 44px;\n            display: none;\n        }\n    <\/style>\n\n    <h2>Steganography Tool<\/h2>\n\n    <!-- Encode Section -->\n    <div class=\"steg_section\">\n        <h3>Encode Secret Message<\/h3>\n        <label for=\"steg_encode_file_input\">Select Image (PNG \/ JPEG):<\/label>\n        <input type=\"file\" class=\"steg_encode_file\" accept=\"image\/png, image\/jpeg\">\n        \n        <label for=\"steg_encode_text_input\">Secret Text Message:<\/label>\n        <textarea class=\"steg_encode_text\" placeholder=\"Type the secret message you want to hide...\"><\/textarea>\n        \n        <div class=\"steg_btn_group\">\n            <button type=\"button\" class=\"steg_btn_primary steg_encode_btn\">Encode &#038; Download<\/button>\n            <button type=\"button\" class=\"steg_btn_secondary steg_clear_btn\">Clear<\/button>\n        <\/div>\n        \n        <div class=\"steg_alert steg_encode_alert\"><\/div>\n    <\/div>\n\n    <hr>\n\n    <!-- Decode Section -->\n    <div class=\"steg_section\">\n        <h3>Reveal Secret Message<\/h3>\n        <label for=\"steg_decode_file_input\">Select Encoded Image (PNG):<\/label>\n        <input type=\"file\" class=\"steg_decode_file\" accept=\"image\/png, image\/jpeg\">\n        \n        <div class=\"steg_btn_group\">\n            <button type=\"button\" class=\"steg_btn_primary steg_decode_btn\">Reveal Secret<\/button>\n        <\/div>\n        \n        <div class=\"steg_alert steg_decode_alert\"><\/div>\n        <div class=\"steg_output_box steg_decode_output\"><\/div>\n    <\/div>\n\n    <script>\n        (function() {\n            \"use strict\";\n\n            function steg_init() {\n                const wrappers = document.querySelectorAll('.steg_tool_wrapper');\n                \n                wrappers.forEach(wrapper => {\n                    const encodeFile = wrapper.querySelector('.steg_encode_file');\n                    const encodeText = wrapper.querySelector('.steg_encode_text');\n                    const encodeBtn = wrapper.querySelector('.steg_encode_btn');\n                    const encodeAlert = wrapper.querySelector('.steg_encode_alert');\n                    \n                    const decodeFile = wrapper.querySelector('.steg_decode_file');\n                    const decodeBtn = wrapper.querySelector('.steg_decode_btn');\n                    const decodeAlert = wrapper.querySelector('.steg_decode_alert');\n                    const decodeOutput = wrapper.querySelector('.steg_decode_output');\n                    \n                    const clearBtn = wrapper.querySelector('.steg_clear_btn');\n\n                    if (!encodeFile || !encodeText || !encodeBtn || !decodeFile || !decodeBtn || !clearBtn) {\n                        return;\n                    }\n\n                    function steg_showAlert(element, message, type) {\n                        try {\n                            element.textContent = message;\n                            element.className = 'steg_alert steg_alert_' + type;\n                            element.style.display = 'block';\n                        } catch (e) {\n                            console.error(\"Steganography Tool Alert Error:\", e);\n                        }\n                    }\n\n                    function steg_hideAlert(element) {\n                        try {\n                            element.style.display = 'none';\n                            element.textContent = '';\n                        } catch (e) {\n                            console.error(\"Steganography Tool Hide Alert Error:\", e);\n                        }\n                    }\n\n                    function steg_textToBinary(text) {\n                        const binArray = [];\n                        const utf8Encoder = new TextEncoder();\n                        const utf8Bytes = utf8Encoder.encode(text);\n                        \n                        for (let i = 0; i < utf8Bytes.length; i++) {\n                            const byte = utf8Bytes[i];\n                            const binString = byte.toString(2).padStart(8, '0');\n                            for (let j = 0; j < 8; j++) {\n                                binArray.push(parseInt(binString[j], 10));\n                            }\n                        }\n                        \/\/ Add 8-bit zero terminator\n                        for (let j = 0; j < 8; j++) {\n                            binArray.push(0);\n                        }\n                        return binArray;\n                    }\n\n                    clearBtn.addEventListener('click', function() {\n                        try {\n                            encodeFile.value = '';\n                            encodeText.value = '';\n                            decodeFile.value = '';\n                            decodeOutput.style.display = 'none';\n                            decodeOutput.textContent = '';\n                            steg_hideAlert(encodeAlert);\n                            steg_hideAlert(decodeAlert);\n                        } catch (e) {\n                            console.error(\"Steganography Tool Clear Error:\", e);\n                        }\n                    });\n\n                    encodeBtn.addEventListener('click', function() {\n                        try {\n                            steg_hideAlert(encodeAlert);\n                            const file = encodeFile.files[0];\n                            const text = encodeText.value;\n\n                            if (!file) {\n                                steg_showAlert(encodeAlert, 'Please select an image file first.', 'error');\n                                return;\n                            }\n                            if (!text) {\n                                steg_showAlert(encodeAlert, 'Please enter a secret message to encode.', 'error');\n                                return;\n                            }\n\n                            const reader = new FileReader();\n                            reader.onload = function(e) {\n                                try {\n                                    const img = new Image();\n                                    img.onload = function() {\n                                        try {\n                                            const canvas = document.createElement('canvas');\n                                            const ctx = canvas.getContext('2d', { willReadFrequently: true });\n                                            canvas.width = img.width;\n                                            canvas.height = img.height;\n                                            ctx.drawImage(img, 0, 0);\n\n                                            const imgData = ctx.getImageData(0, 0, canvas.width, canvas.height);\n                                            const pixels = imgData.data;\n\n                                            const binMsg = steg_textToBinary(text);\n                                            const totalChannels = (pixels.length \/ 4) * 3;\n\n                                            if (binMsg.length > totalChannels) {\n                                                steg_showAlert(encodeAlert, 'The secret message is too long for this image. Please choose a larger image or shorten the message.', 'error');\n                                                return;\n                                            }\n\n                                            let msgIndex = 0;\n                                            for (let i = 0; i < pixels.length; i += 4) {\n                                                for (let c = 0; c < 3; c++) {\n                                                    if (msgIndex < binMsg.length) {\n                                                        pixels[i + c] = (pixels[i + c] &#038; ~1) | binMsg[msgIndex];\n                                                        msgIndex++;\n                                                    }\n                                                }\n                                            }\n\n                                            ctx.putImageData(imgData, 0, 0);\n\n                                            canvas.toBlob(function(blob) {\n                                                if (!blob) {\n                                                    steg_showAlert(encodeAlert, 'Failed to create image blob.', 'error');\n                                                    return;\n                                                }\n                                                const url = URL.createObjectURL(blob);\n                                                const link = document.createElement('a');\n                                                link.download = 'stego-image.png';\n                                                link.href = url;\n                                                document.body.appendChild(link);\n                                                link.click();\n                                                document.body.removeChild(link);\n                                                setTimeout(() => URL.revokeObjectURL(url), 1000);\n\n                                                steg_showAlert(encodeAlert, 'Secret message encoded successfully! Image downloaded.', 'success');\n                                            }, 'image\/png');\n\n                                        } catch (canvasErr) {\n                                            console.error(\"Canvas processing error:\", canvasErr);\n                                            steg_showAlert(encodeAlert, 'Error processing image pixels: ' + canvasErr.message, 'error');\n                                        }\n                                    };\n                                    img.onerror = function() {\n                                        steg_showAlert(encodeAlert, 'Failed to load the image. Please try another file.', 'error');\n                                    };\n                                    img.src = e.target.result;\n                                } catch (readerLoadErr) {\n                                    console.error(\"FileReader load callback error:\", readerLoadErr);\n                                    steg_showAlert(encodeAlert, 'Error reading file content.', 'error');\n                                }\n                            };\n                            reader.onerror = function() {\n                                steg_showAlert(encodeAlert, 'Failed to read the file.', 'error');\n                            };\n                            reader.readAsDataURL(file);\n                        } catch (outerEncErr) {\n                            console.error(\"Encode button handler error:\", outerEncErr);\n                            steg_showAlert(encodeAlert, 'An unexpected error occurred during encoding.', 'error');\n                        }\n                    });\n\n                    decodeBtn.addEventListener('click', function() {\n                        try {\n                            steg_hideAlert(decodeAlert);\n                            decodeOutput.style.display = 'none';\n                            decodeOutput.textContent = '';\n\n                            const file = decodeFile.files[0];\n                            if (!file) {\n                                steg_showAlert(decodeAlert, 'Please select an encoded image file first.', 'error');\n                                return;\n                            }\n\n                            const reader = new FileReader();\n                            reader.onload = function(e) {\n                                try {\n                                    const img = new Image();\n                                    img.onload = function() {\n                                        try {\n                                            const canvas = document.createElement('canvas');\n                                            const ctx = canvas.getContext('2d', { willReadFrequently: true });\n                                            canvas.width = img.width;\n                                            canvas.height = img.height;\n                                            ctx.drawImage(img, 0, 0);\n\n                                            const imgData = ctx.getImageData(0, 0, canvas.width, canvas.height);\n                                            const pixels = imgData.data;\n\n                                            let extractedBits = [];\n                                            let byteChunks = [];\n                                            let foundTerminator = false;\n\n                                            for (let i = 0; i < pixels.length; i += 4) {\n                                                for (let c = 0; c < 3; c++) {\n                                                    extractedBits.push(pixels[i + c] &#038; 1);\n\n                                                    if (extractedBits.length === 8) {\n                                                        let byteVal = 0;\n                                                        for (let b = 0; b < 8; b++) {\n                                                            byteVal = (byteVal << 1) | extractedBits[b];\n                                                        }\n\n                                                        if (byteVal === 0) {\n                                                            foundTerminator = true;\n                                                            break;\n                                                        }\n\n                                                        byteChunks.push(byteVal);\n                                                        extractedBits = [];\n                                                    }\n                                                }\n                                                if (foundTerminator) break;\n                                            }\n\n                                            if (byteChunks.length === 0) {\n                                                steg_showAlert(decodeAlert, 'No hidden message found in this image.', 'error');\n                                                return;\n                                            }\n\n                                            const byteArray = new Uint8Array(byteChunks);\n                                            const utf8Decoder = new TextDecoder();\n                                            const decodedText = utf8Decoder.decode(byteArray);\n\n                                            if (decodedText.length === 0) {\n                                                steg_showAlert(decodeAlert, 'No valid secret text message was detected.', 'error');\n                                            } else {\n                                                steg_showAlert(decodeAlert, 'Secret message revealed successfully!', 'success');\n                                                decodeOutput.textContent = decodedText;\n                                                decodeOutput.style.display = 'block';\n                                            }\n                                        } catch (canvasDecErr) {\n                                            console.error(\"Decode canvas error:\", canvasDecErr);\n                                            steg_showAlert(decodeAlert, 'Error reading pixels from image: ' + canvasDecErr.message, 'error');\n                                        }\n                                    };\n                                    img.onerror = function() {\n                                        steg_showAlert(decodeAlert, 'Failed to read the image file.', 'error');\n                                    };\n                                    img.src = e.target.result;\n                                } catch (readerLoadErr) {\n                                    console.error(\"Decode reader load error:\", readerLoadErr);\n                                    steg_showAlert(decodeAlert, 'Error parsing image file data.', 'error');\n                                }\n                            };\n                            reader.onerror = function() {\n                                steg_showAlert(decodeAlert, 'Failed to read the file.', 'error');\n                            };\n                            reader.readAsDataURL(file);\n                        } catch (outerDecErr) {\n                            console.error(\"Decode button handler error:\", outerDecErr);\n                            steg_showAlert(decodeAlert, 'An unexpected error occurred during decoding.', 'error');\n                        }\n                    });\n                });\n            }\n\n            if (document.readyState === 'loading') {\n                document.addEventListener('DOMContentLoaded', steg_init);\n            } else {\n                steg_init();\n            }\n        })();\n    <\/script>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Steganography Tool Encode Secret Message Select Image (PNG \/ JPEG): Secret Text Message: Encode &#038; Download Clear Reveal Secret Message Select Encoded Image (PNG): Reveal Secret<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-569","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/freewebtools.co.in\/index.php\/wp-json\/wp\/v2\/pages\/569","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/freewebtools.co.in\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/freewebtools.co.in\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/freewebtools.co.in\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/freewebtools.co.in\/index.php\/wp-json\/wp\/v2\/comments?post=569"}],"version-history":[{"count":10,"href":"https:\/\/freewebtools.co.in\/index.php\/wp-json\/wp\/v2\/pages\/569\/revisions"}],"predecessor-version":[{"id":579,"href":"https:\/\/freewebtools.co.in\/index.php\/wp-json\/wp\/v2\/pages\/569\/revisions\/579"}],"wp:attachment":[{"href":"https:\/\/freewebtools.co.in\/index.php\/wp-json\/wp\/v2\/media?parent=569"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}