<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Rishu</title>
    <description>The latest articles on DEV Community by Rishu (@rishu50).</description>
    <link>https://dev.to/rishu50</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3948651%2F4d41437e-a334-4cef-a4da-c2a08124d9e5.jpg</url>
      <title>DEV Community: Rishu</title>
      <link>https://dev.to/rishu50</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rishu50"/>
    <language>en</language>
    <item>
      <title>I Built an Image Steganography Tool — Hide Any File Inside a PNG with AES-256 Encryption</title>
      <dc:creator>Rishu</dc:creator>
      <pubDate>Wed, 01 Jul 2026 08:06:52 +0000</pubDate>
      <link>https://dev.to/rishu50/i-built-an-image-steganography-tool-hide-any-file-inside-a-png-with-aes-256-encryption-4chd</link>
      <guid>https://dev.to/rishu50/i-built-an-image-steganography-tool-hide-any-file-inside-a-png-with-aes-256-encryption-4chd</guid>
      <description>&lt;p&gt;I've been fascinated by steganography for a while — the idea that you can hide a file inside an image, and nobody would ever know it's there. Not just encrypted, but completely invisible.&lt;/p&gt;

&lt;p&gt;So I built &lt;a href="https://stegoimage.pages.dev" rel="noopener noreferrer"&gt;Stego.Image&lt;/a&gt;. A free, open-source tool that does exactly that — hide any file inside a PNG image, entirely in your browser.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is steganography?
&lt;/h2&gt;

&lt;p&gt;Steganography is hiding data inside another file so that the existence of the hidden data is concealed. It's different from encryption — encryption makes data unreadable, steganography makes data invisible.&lt;/p&gt;

&lt;p&gt;The most common digital technique is &lt;strong&gt;LSB steganography&lt;/strong&gt; — hiding bits of data in the least significant bits of image pixels. Changing the last bit of a pixel's color value shifts it by just 1 out of 255. Completely imperceptible to the human eye.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Original:  11001010  →  202
Modified:  11001011  →  203  ← you cannot see this difference
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A 1920×1080 image has over 2 million pixels. At 3 bits per pixel across RGB channels, that's enough to hide ~777 KB of data — invisibly.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why I built this
&lt;/h2&gt;

&lt;p&gt;Most steganography tools I found were either desktop-only, outdated, or required uploading your file to a server. That last part kills the entire point — if your secret file touches someone else's server, it's not secret anymore.&lt;/p&gt;

&lt;p&gt;I wanted something that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;runs entirely in the browser&lt;/li&gt;
&lt;li&gt;uses proper modern encryption&lt;/li&gt;
&lt;li&gt;works on any device, no install&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I built it.&lt;/p&gt;




&lt;h2&gt;
  
  
  How Stego.Image works
&lt;/h2&gt;

&lt;p&gt;The pipeline has three stages:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Compress&lt;/strong&gt;&lt;br&gt;
The file is compressed using DEFLATE before anything else. Encrypted data is incompressible (it looks like random noise), so compression must happen first. This reduces payload size and increases how much you can hide.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Encrypt&lt;/strong&gt;&lt;br&gt;
Compressed data is encrypted with AES-256. The key is derived using PBKDF2-SHA256 at 100,000 iterations with a randomly generated salt — so your password never becomes the key directly. This makes brute-force attacks computationally expensive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Embed&lt;/strong&gt;&lt;br&gt;
Encrypted bits are written into the LSBs of each RGB pixel channel using the HTML5 Canvas API. The output is saved as PNG — always PNG, because JPEG's lossy compression would destroy the embedded data on save.&lt;/p&gt;




&lt;h2&gt;
  
  
  Using it
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Hide a file:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Upload a PNG carrier image&lt;/li&gt;
&lt;li&gt;Upload the file you want to hide (any format — PDF, ZIP, image, document, anything)&lt;/li&gt;
&lt;li&gt;Set a password&lt;/li&gt;
&lt;li&gt;Download the output image&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The output looks identical to the original. Nobody can tell the difference.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Extract a file:&lt;/strong&gt;&lt;br&gt;
Upload the stego image → enter the password → download your file.&lt;/p&gt;

&lt;p&gt;That's it. No account, no install, no server. Try it at &lt;a href="https://stegoimage.pages.dev" rel="noopener noreferrer"&gt;stego.image&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The security problem I fixed mid-build
&lt;/h2&gt;

&lt;p&gt;The first version used crypto-js's default &lt;code&gt;EvpKDF&lt;/code&gt; for key derivation — MD5-based, fast, and completely wrong for a security tool. It's the kind of thing that passes a quick test but fails the moment someone runs a brute-force attack.&lt;/p&gt;

&lt;p&gt;I replaced it with PBKDF2-SHA256 at 100k iterations with a random salt. Files encoded with the old version are intentionally incompatible with the new one. Security over backward compatibility — no exceptions.&lt;/p&gt;




&lt;h2&gt;
  
  
  What you can use it for
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Sending sensitive documents without revealing what's being transferred&lt;/li&gt;
&lt;li&gt;Embedding invisible ownership metadata in images you distribute&lt;/li&gt;
&lt;li&gt;Security research — understanding how LSB steganalysis works by building the thing it's trying to detect&lt;/li&gt;
&lt;li&gt;Anywhere you need plausible deniability about a file's existence&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Stack
&lt;/h2&gt;

&lt;p&gt;React 19, Vite, crypto-js, pako, Bootstrap 5, deployed on Cloudflare Pages.&lt;/p&gt;

&lt;p&gt;The entire thing is static — Cloudflare serves the build, your browser does all the work.&lt;/p&gt;




&lt;p&gt;🌐 &lt;strong&gt;Live:&lt;/strong&gt; &lt;a href="https://stegoimage.pages.dev" rel="noopener noreferrer"&gt;https://stegoimage.pages.dev&lt;/a&gt;&lt;br&gt;&lt;br&gt;
🐙 &lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/50RISHU/Stego.Image" rel="noopener noreferrer"&gt;https://github.com/50RISHU/Stego.Image&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;MIT licensed. If you find a bug or want to contribute, PRs are open.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>opensource</category>
      <category>security</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Image Steganography tool</title>
      <dc:creator>Rishu</dc:creator>
      <pubDate>Sat, 20 Jun 2026 06:57:12 +0000</pubDate>
      <link>https://dev.to/rishu50/-5h5</link>
      <guid>https://dev.to/rishu50/-5h5</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/rishu50/i-built-a-free-tool-to-hide-files-inside-images-aes-256-fully-client-side-1ioh" class="crayons-story__hidden-navigation-link"&gt;Image Steganography Tool: Hide Any File Inside a PNG — AES-256 &amp;amp; Fully Client-Side&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/rishu50" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3948651%2F4d41437e-a334-4cef-a4da-c2a08124d9e5.jpg" alt="rishu50 profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/rishu50" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Rishu
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Rishu
                
              
              &lt;div id="story-author-preview-content-3839827" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/rishu50" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3948651%2F4d41437e-a334-4cef-a4da-c2a08124d9e5.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Rishu&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/rishu50/i-built-a-free-tool-to-hide-files-inside-images-aes-256-fully-client-side-1ioh" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jun 7&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/rishu50/i-built-a-free-tool-to-hide-files-inside-images-aes-256-fully-client-side-1ioh" id="article-link-3839827"&gt;
          Image Steganography Tool: Hide Any File Inside a PNG — AES-256 &amp;amp; Fully Client-Side
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag crayons-tag--filled  " href="/t/showdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;showdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/javascript"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;javascript&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/opensource"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;opensource&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/security"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;security&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/rishu50/i-built-a-free-tool-to-hide-files-inside-images-aes-256-fully-client-side-1ioh" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt;&amp;nbsp;reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/rishu50/i-built-a-free-tool-to-hide-files-inside-images-aes-256-fully-client-side-1ioh#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            2 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
  </channel>
</rss>
