// Copyright © 2020 rsiddharth <s@ricketyspace.net>
// SPDX-License-Identifier: ISC
package challenge
import (
"fmt"
"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 = `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`