Lately there have been some articles on that 10% of the internet I protected by lava lamp encryption. Cloudflare have a wall of lava lamps that theire encryption take photos of to compute a more random password. Even though their encryption algorithms is most likely never going to run out of randomnes, they added a layer with total randomnes that is absolutley unpossible to predict. They take photos of a huge wall of lavalamps. Even if there is static/noise in the picture , thats bether. It helps to add even more randomnes.
I thought as a fun little weekend project i would look at how i could create a simplified proof of conecpt in PowerShell to generate a more random password that Get-Random is capable of.
First i needed something that could read picturefiles. Some time ago i came over a cool function/script from Prateek Singh called Write-Pixel. You can find it over at his awesome blog here. Its limited to 16 collors, but within that frame it finds the closest collor to each pixel in a picture. So what i did was instead of naming the colors likes this:
I used a random string generator to generate a random string with 200 characters for each of the collors. So it ended up like this:
After this i edited the script som i instead of outputting a blank space with background collor, it outputted the “collor” name/text to a variable. After the script is done analyzing the whole picture and have created a huge text/string. Ecspecialy if its a high res photo like 3000*2000 pixels. Thats 3 million pixels! I then run a command that selects 20 random characters from that 3 million * 200 character long string.
Now you have a bit more random password than what Get-Random can produce alone.
I dont say that this is extremely secure. Probbaly would have been better if the string/name of each collor was generated by some sort of algorithm or used Get-Random to select the text that was goign to be set for each collor.
I would sugest to test with a verry small picture, or else it will take a great deal of time to analyze the picture. I have added so the script outputs each collorcode so we can see some sort of progress. Probbaly would have run faster without the output.
$script:passwordstring = "1" Function Write-Pixel { param( $Path = 'C:\webcamphotos\WIN_20180106_19_42_31_Pro.jpg' ) Begin { [void] [System.Reflection.Assembly]::LoadWithPartialName("System.drawing") # Console Colors and their Hexadecimal values $Colors = @{ 'FF000000' = '[email protected][email protected]!cigrI5lxPTeK!vZdLmKyin0msSF$qm86!UVVMkz6xTGQkCRYy4ULBqD8va9ZeNcb3ceJsU[email protected]S' 'FF000080' = '[email protected][email protected]S[email protected][email protected]$e$PFNMSm' 'FF008000' = 'CeKD[email protected][email protected][email protected]!MDwYiuia61J9rbr!wj01pi0luSxF6iMTopyuaG8WFkgY7rzxnrtOu$mbzw8rgbBVuBUuO' 'FF008080' = '[email protected]@[email protected]s[email protected][email protected]$GI' 'FF800000' = '0fFtGyhr63uX1LOBDuX49bgRq1mbXVB4cll4nWYvyY!VDSC0EfNLkMgf[email protected][email protected]YEt$9n78PhlKWxkH' 'FF800080' = 'W3cV$iPWJhwKNI8l[email protected][email protected][email protected]' 'FF808000' = 'Nh6GLrZbSqbNir3WM4GZiwsU3lupPJhO$RG1x9YL0SQ6VEj$YKUy5HETo0JsoCVZjE[email protected][email protected][email protected]$' 'FFC0C0C0' = 'ax$1Md0v5buwvzspjctSFDqQFlWPBQh08egQdbOug18NZqJQ$KkV[email protected][email protected]@[email protected]' 'FF808080' = 'Tv1szp5wbq9WUJhSgaw6wmRqqMzouN$!p2OeB4tyd8R[email protected][email protected]@P9Ydru!OQtFETKsQ9CcBo$XsOo4V' 'FF0000FF' = 'zqLMWjHXHTcBq!T6LEBYuo8fifqkhRFQ79llps94tyui9uceEKUm3FyMz1HsBoorcJYZFy$ABeKdN!3Kvxj85sRJ0vkR7vMMH!c1se3FEmfUjwxUMJ3b9vzxBEXkiE3Wg2eaNPQ44ETPtW4Bv78Ik$rBFE0F9ysQXT7L!dhBk4bKDwNo5cg4i6e8oB0a7TPUkmOmyMny' 'FF00FF00' = 'R0M6FfUlX8[email protected]el9L86fNL8ZqTkDmhrVmrtwVsSGbws9lSxC!c5sKYNuYcigwMQBV4k$[email protected]8DCm87U' 'FF00FFFF' = '[email protected]!RqymlAj9icNwSrBlX7ENnvL[email protected][email protected]@xnSmic4HMV[email protected]' 'FFFF0000' = '[email protected][email protected][email protected][email protected][email protected]' 'FFFF00FF' = '[email protected]$HFxlHQvNP8b2u3Y8tPfBPlszhjLHEjVmgMAGitL[email protected][email protected][email protected]' 'FFFFFF00' = '[email protected][email protected]11tRPMxWHnntSnGNn0X3WMuMSJKDbDE8LbA7YSJVsCasrkILYmsvsdHypsEiRG!5zNcxxU3afAHg9qnwu9ewiRzAvw' 'FFFFFFFF' = '[email protected][email protected]@[email protected]@[email protected]$xPQQ0rmU6tzp4' } # Algorithm to calculate closest Console color (Only 16) to a color of Pixel Function Get-ClosetConsoleColor($PixelColor) { $Differences = Foreach($item in $Colors.Keys) { ''|select @{n='Color';e={$Item}},@{n='Diff';e={[math]::abs([convert]::ToInt32($Item,16) - [convert]::ToInt32($PixelColor,16))}} } ($Differences |sort Diff)[0].color } } Process { Foreach($item in $Path) { #Convert Image to BitMap $BitMap = [System.Drawing.Bitmap]::FromFile((Get-Item $Item).fullname) Foreach($y in (1..($BitMap.Height-1))) { Foreach($x in (1..($BitMap.Width-1))) { $Pixel = $BitMap.GetPixel($X,$Y) $BackGround = $Colors.Item((Get-ClosetConsoleColor $Pixel.name)) $script:passwordstring += "$BackGround" $pixel.name } } } } end { } } Write-Pixel for ($i = 0; $i -lt 20; $i++ ) { $newpassword += $script:passwordstring[(Get-Random -Minimum 0 -Maximum $passwordstring.Length)] } $newpassword