diff options
Diffstat (limited to 'challenge')
-rw-r--r-- | challenge/c06.go | 181 |
1 files changed, 133 insertions, 48 deletions
diff --git a/challenge/c06.go b/challenge/c06.go index 6bd7faf..9e0d81d 100644 --- a/challenge/c06.go +++ b/challenge/c06.go @@ -8,6 +8,139 @@ import ( "ricketyspace.net/cryptopals/lib" ) +func C6() { + bs := lib.Base64ToBytes(cipher) + + // Compute keysize. + ks := lib.KeySizeWithMinDistance(2, 40, bs) + fmt.Printf("Computed key size: %d\n", ks) + + // Crack key and decrypt data. + key, text := crack(bs, ks) + + // Barf result. + fmt.Printf("Key is '%s'\n", key) + fmt.Printf("Decrypted text:\n%s", text) +} + +// 'bs' is the data to decrypt. +// 'ks' is the key size. +func crack(bs []byte, ks int) (string, string) { + blocks := lib.BreakIntoBlocks(bs, ks) + blocks = lib.TransposeBlocks(blocks, ks) + + key = "" + for i := 0; i < len(blocks); i++ { + k := findKey(blocks[i]) + + key += string(k) + } + return key, lib.RepeatingXOR(string(bs), key) +} + +func findKey(block []byte) byte { + var k byte + var s int + + s = 0 + for i := byte(0); i < 255; i++ { + ks := lib.FillBytes(i, len(block)) + xs := lib.FixedXORBytes(block, ks) + + score := lib.AlphaPunchScore(xs) + if score > s { + s = score + k = i + } + } + return k +} + +// Output: +// +// Computed key size: 29 +// Key is 'Terminator X: Bring the noise' +// Decrypted text: +// I'm back and I'm ringin' the bell +// A rockin' on the mike while the fly girls yell +// In ecstasy in the back of me +// Well that's my DJ Deshay cuttin' all them Z's +// Hittin' hard and the girlies goin' crazy +// Vanilla's on the mike, man I'm not lazy. +// +// I'm lettin' my drug kick in +// It controls my mouth and I begin +// To just let it flow, let my concepts go +// My posse's to the side yellin', Go Vanilla Go! +// +// Smooth 'cause that's the way I will be +// And if you don't give a damn, then +// Why you starin' at me +// So get off 'cause I control the stage +// There's no dissin' allowed +// I'm in my own phase +// The girlies sa y they love me and that is ok +// And I can dance better than any kid n' play +// +// Stage 2 -- Yea the one ya' wanna listen to +// It's off my head so let the beat play through +// So I can funk it up and make it sound good +// 1-2-3 Yo -- Knock on some wood +// For good luck, I like my rhymes atrocious +// Supercalafragilisticexpialidocious +// I'm an effect and that you can bet +// I can take a fly girl and make her wet. +// +// I'm like Samson -- Samson to Delilah +// There's no denyin', You can try to hang +// But you'll keep tryin' to get my style +// Over and over, practice makes perfect +// But not if you're a loafer. +// +// You'll get nowhere, no place, no time, no girls +// Soon -- Oh my God, homebody, you probably eat +// Spaghetti with a spoon! Come on and say it! +// +// VIP. Vanilla Ice yep, yep, I'm comin' hard like a rhino +// Intoxicating so you stagger like a wino +// So punks stop trying and girl stop cryin' +// Vanilla Ice is sellin' and you people are buyin' +// 'Cause why the freaks are jockin' like Crazy Glue +// Movin' and groovin' trying to sing along +// All through the ghetto groovin' this here song +// Now you're amazed by the VIP posse. +// +// Steppin' so hard like a German Nazi +// Startled by the bases hittin' ground +// There's no trippin' on mine, I'm just gettin' down +// Sparkamatic, I'm hangin' tight like a fanatic +// You trapped me once and I thought that +// You might have it +// So step down and lend me your ear +// '89 in my time! You, '90 is my year. +// +// You're weakenin' fast, YO! and I can tell it +// Your body's gettin' hot, so, so I can smell it +// So don't be mad and don't be sad +// 'Cause the lyrics belong to ICE, You can call me Dad +// You're pitchin' a fit, so step back and endure +// Let the witch doctor, Ice, do the dance to cure +// So come up close and don't be square +// You wanna battle me -- Anytime, anywhere +// +// You thought that I was weak, Boy, you're dead wrong +// So come on, everybody and sing this song +// +// Say -- Play that funky music Say, go white boy, go white boy go +// play that funky music Go white boy, go white boy, go +// Lay down and boogie and play that funky music till you die. +// +// Play that funky music Come on, Come on, let me hear +// Play that funky music white boy you say it, say it +// Play that funky music A little louder now +// Play that funky music, white boy Come on, Come on, Come on +// Play that funky music + var cipher string = `HUIfTQsPAh9PE048GmllH0kcDk4TAQsHThsBFkU2AB4BSWQgVB0dQzNTTmVS BgBHVBwNRU0HBAxTEjwMHghJGgkRTxRMIRpHKwAFHUdZEQQJAGQmB1MANxYG DBoXQR0BUlQwXwAgEwoFR08SSAhFTmU+Fgk4RQYFCBpGB08fWXh+amI2DB0P @@ -72,51 +205,3 @@ DBBOFRwOBgA+T04pC0kDElMdC0VXBgYdFkU2CgtNEAEUVBwTWXhTVG5SGg8e AB0cRSo+AwgKRSANExlJCBQaBAsANU9TKxFJL0dMHRwRTAtPBRwQMAAATQcB FlRlIkw5QwA2GggaR0YBBg5ZTgIcAAw3SVIaAQcVEU8QTyEaYy0fDE4ITlhI Jk8DCkkcC3hFMQIEC0EbAVIqCFZBO1IdBgZUVA4QTgUWSR4QJwwRTWM=` - -func C6() { - bs := lib.Base64ToBytes(cipher) - - // Compute keysize. - ks := lib.KeySizeWithMinDistance(2, 40, bs) - fmt.Printf("Computed key size: %d\n", ks) - - // Crack key and decrypt data. - key, text := crack(bs, ks) - - // Barf result. - fmt.Printf("Key is '%s'\n", key) - fmt.Printf("Decrypted text:\n%s", text) -} - -// 'bs' is the data to decrypt. -// 'ks' is the key size. -func crack(bs []byte, ks int) (string, string) { - blocks := lib.BreakIntoBlocks(bs, ks) - blocks = lib.TransposeBlocks(blocks, ks) - - key = "" - for i := 0; i < len(blocks); i++ { - k := findKey(blocks[i]) - - key += string(k) - } - return key, lib.RepeatingXOR(string(bs), key) -} - -func findKey(block []byte) byte { - var k byte - var s int - - s = 0 - for i := byte(0); i < 255; i++ { - ks := lib.FillBytes(i, len(block)) - xs := lib.FixedXORBytes(block, ks) - - score := lib.AlphaPunchScore(xs) - if score > s { - s = score - k = i - } - } - return k -} |