Advertisement
Guest User

Untitled

a guest
Jul 3rd, 2020
1,398
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 10.25 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "bytes"
  5.     "encoding/binary"
  6.     "encoding/hex"
  7.     "fmt"
  8. )
  9.  
  10. var sbox = []int{
  11.     0x86, 0xBC, 0xFD, 0x94, 0xC9, 0x3F, 0x77, 0x25, 0xC4, 0xE9, 0x9B, 0xD2, 0xA2, 0x59, 0x55,
  12.     0x1E, 0xAB, 0x0C, 0x24, 0x41, 0x4B, 0x4F, 0x9C, 0x2B, 0xE8, 0xE3, 0xE5, 0x03, 0xB9, 0xEC,
  13.     0x21, 0xFC, 0x58, 0x00, 0x30, 0x7B, 0x3A, 0xA8, 0x1C, 0x53, 0x11, 0x6E, 0x9D, 0xB6, 0xF9,
  14.     0x70, 0xB5, 0xE1, 0x43, 0x09, 0xB4, 0x08, 0xBD, 0x3B, 0xA0, 0xFF, 0x80, 0xA9, 0x29, 0x32,
  15.     0xBE, 0x15, 0x65, 0xEA, 0x7C, 0x26, 0xED, 0xDD, 0x9E, 0x0D, 0x5F, 0x4E, 0x37, 0x2E, 0xA5,
  16.     0x0A, 0x01, 0x97, 0x7F, 0x6D, 0x5A, 0x89, 0x62, 0x4C, 0xE7, 0x5D, 0x2D, 0x8C, 0xAF, 0x95,
  17.     0x13, 0x7E, 0xCB, 0x8E, 0x0F, 0xC1, 0xB3, 0xC8, 0x19, 0xF8, 0xC7, 0x8F, 0x04, 0x1A, 0xBF,
  18.     0x52, 0x34, 0x9F, 0x2A, 0x79, 0x56, 0x81, 0xD0, 0x98, 0x91, 0x39, 0x02, 0xB1, 0x38, 0x0B,
  19.     0x12, 0xBA, 0xF6, 0x6F, 0x5E, 0xEB, 0x3D, 0xD7, 0xE6, 0xFE, 0x50, 0xE0, 0x6A, 0x87, 0x85,
  20.     0x1F, 0xDC, 0x64, 0x71, 0xB0, 0x3E, 0xA4, 0x63, 0xF0, 0x68, 0x83, 0x46, 0x93, 0xEE, 0x60,
  21.     0x82, 0xAA, 0x88, 0x10, 0x40, 0x22, 0x66, 0xC0, 0x5C, 0x2C, 0xDB, 0x54, 0xC2, 0x61, 0x7D,
  22.     0x20, 0x1D, 0x8B, 0x84, 0x8A, 0x7A, 0x4A, 0x18, 0x33, 0xF1, 0xFB, 0x06, 0x49, 0x51, 0x74,
  23.     0x73, 0x17, 0xB7, 0xD6, 0x9A, 0xD8, 0xF5, 0x14, 0xCC, 0xB8, 0x0E, 0x4D, 0xDE, 0xBB, 0x42,
  24.     0xF4, 0xFA, 0x2F, 0xDA, 0xAE, 0xA1, 0x90, 0xB2, 0x31, 0x35, 0x05, 0xD9, 0xC5, 0xCD, 0xDF,
  25.     0x44, 0x07, 0x76, 0x6C, 0x27, 0xAD, 0x67, 0x23, 0xD1, 0x92, 0x28, 0xCF, 0x78, 0x75, 0xC3,
  26.     0xAC, 0x69, 0x48, 0xF3, 0xE4, 0x36, 0x72, 0x5B, 0x3C, 0x1B, 0x47, 0xCA, 0xC6, 0x6B, 0xF2,
  27.     0xA6, 0xF7, 0xD5, 0x99, 0x96, 0xD4, 0x45, 0xA3, 0x16, 0xCE, 0xA7, 0x57, 0x8D, 0xE2, 0xEF,
  28.     0xD3,
  29. }
  30.  
  31. var blowfishSub = []int{
  32.     0x9C30D539,
  33.     0x2AF26013,
  34.     0xC5D1B023,
  35.     0x286085F0,
  36. }
  37.  
  38. var blowfishP = []int{
  39.     0x452821E6, 0x38D01377, 0xBE5466CF, 0x34E90C6C, 0xC0AC29B7, 0xC97C50DD,
  40.     0x3F84D5B5, 0xB5470917, 0x9216D5D9, 0x8979FB1B, 0xD1310BA6, 0x98DFB5AC,
  41.     0x2FFD72DB, 0xD01ADFB7, 0xB8E1AFED, 0x6A267E96, 0xBA7C9045, 0xF12C7F99,
  42.     0x24A19947, 0xB3916CF7, 0x801F2E2, 0x858EFC16, 0x636920D8, 0x71574E69,
  43.     0xA458FEA3, 0xF4933D7E, 0xD95748F, 0x728EB658, 0x718BCD58, 0x82154AEE,
  44.     0x7B54A41D, 0xC25A59B5,
  45. }
  46.  
  47. func subDword(x int) int {
  48.     a := (x >> 24) & 0xFF
  49.     b := (x >> 16) & 0xFF
  50.     c := (x >> 8) & 0xFF
  51.     d := x & 0xFF
  52.     y := sbox[d]
  53.     y |= sbox[c] << 8
  54.     y |= sbox[b] << 16
  55.     y |= sbox[a] << 24
  56.     u := ((y << 13) | (y >> 19)) & 0xFFFFFFFF
  57.     v := ((y << 23) | (y >> 9)) & 0xFFFFFFFF
  58.     return y ^ u ^ v
  59. }
  60.  
  61. func keySchedule(initialKey []uint32) []uint32 {
  62.     cs := []uint32{0, 0, 0, 0}
  63.     cs[0] = initialKey[0] ^ uint32(blowfishSub[0])
  64.     cs[1] = initialKey[1] ^ uint32(blowfishSub[1])
  65.     cs[2] = initialKey[2] ^ uint32(blowfishSub[2])
  66.     cs[3] = initialKey[3] ^ uint32(blowfishSub[3])
  67.     state := make([]uint32, 32)
  68.     for i := range state {
  69.         x := cs[0] ^ cs[1] ^ cs[2] ^ cs[3] ^ uint32(blowfishP[i])
  70.         state[i] = uint32(subDword(int(x)))
  71.         cs[0] = cs[1]
  72.         cs[1] = cs[2]
  73.         cs[2] = cs[3]
  74.         cs[3] = uint32(state[i])
  75.     }
  76.     return state
  77. }
  78.  
  79. func subDwordRot(x uint32) int {
  80.     a := (x >> 24) & 0xFF
  81.     b := (x >> 16) & 0xFF
  82.     c := (x >> 8) & 0xFF
  83.     d := x & 0xFF
  84.     v1 := sbox[a]
  85.     v2 := sbox[d]
  86.     v3 := (sbox[b] << 16) | (v1 << 24)
  87.     v4 := v3 | (sbox[c] << 8)
  88.     out := (((v4 | v2) << 10) | (v3 >> 22)) ^ ((v4 >> 8) | (v2 << 24)) ^ (v4 | v2) ^ (4*(v4|v2) | (v1 >> 6)) ^ (((v4 | v2) << 18) | (v4 >> 14))
  89.     return out & 0xFFFFFFFF
  90. }
  91.  
  92. func obfuscDword(inval uint32) uint32 {
  93.     bss := new(bytes.Buffer)
  94.     _ = binary.Write(bss, binary.LittleEndian, inval)
  95.  
  96.     bs := bss.Bytes()
  97.  
  98.     magic := 0x4E67C6A7
  99.     out := weh(uint32(magic), uint32(bs[0])) ^ uint32(magic)
  100.     out = weh(out, uint32(bs[1])) ^ uint32(out)
  101.     out = weh(out, uint32(bs[2])) ^ uint32(out)
  102.     out = weh(out, uint32(bs[3])) ^ uint32(out)
  103.  
  104.     return out
  105. }
  106.  
  107. func mixRowApplyKey(bs []byte, rks []uint32) []uint32 {
  108.     var dws [4]uint32
  109.     bb := bytes.NewReader(bs)
  110.     _ = binary.Read(bb, binary.BigEndian, &dws)
  111.  
  112.     // dws := bs[0:16]
  113.     state := []uint32{
  114.         dws[0],
  115.         dws[1],
  116.         dws[2],
  117.         dws[3],
  118.     }
  119.  
  120.     for i := 0; i < 32; i++ {
  121.         t := rks[i] ^ state[3] ^ state[2] ^ state[1]
  122.         out := uint32(subDwordRot(t)) ^ state[0]
  123.         state[0] = state[1]
  124.         state[1] = state[2]
  125.         state[2] = state[3]
  126.         state[3] = out
  127.     }
  128.  
  129.     return state
  130. }
  131.  
  132. func reverseByteBits(x uint32) uint32 {
  133.     a := ((x >> 1) & 0x55555555) | ((x << 1) & 0xAAAAAAAA)
  134.     b := ((a >> 2) & 0x33333333) | ((a << 2) & 0xCCCCCCCC)
  135.     res := uint32((b>>4)&0xF0F0F0F) | uint32((b<<4)&0xF0F0F0F0)
  136.     return res
  137. }
  138.  
  139. func mixNibbles(x uint32) uint32 {
  140.     return ((((((x & 0xFF) << 4) + ((x >> 8) & 0xFF)) << 4) + ((x >> 16) & 0xFF)) << 4) + ((x >> 24) & 0xFF)
  141. }
  142.  
  143. func weh(a uint32, b uint32) uint32 {
  144.     return ((a << 5) + (a >> 2) + b) & 0xFFFFFFFF
  145. }
  146.  
  147. func rotMess(x uint32) uint32 {
  148.     // pack as little endian uint32 (should already be as such)
  149.     // Read x as characters
  150.     bss := new(bytes.Buffer)
  151.     _ = binary.Write(bss, binary.LittleEndian, x)
  152.  
  153.     bs := bss.Bytes()
  154.     out := uint32(bs[0]) << uint32(11)
  155.     out = out | uint32(bs[1])
  156.     out ^= uint32(bs[0]) >> 5
  157.     out ^= 0xFFFFFFFF
  158.     out ^= uint32(bs[0])
  159.     a := (out << 7) & 0xFFFFFFFF
  160.     a ^= uint32(bs[2])
  161.     out ^= (out >> 3) ^ a
  162.  
  163.     a = (out << 11) & 0xFFFFFFFF
  164.     a ^= uint32(bs[3])
  165.     out ^= ((out >> 5) ^ a) ^ 0xFFFFFFFF
  166.     return out & 0x7FFFFFFF
  167. }
  168.  
  169. // Endian swap
  170. func reverseBytes(x uint32) uint32 {
  171.     var y uint32
  172.     buf := new(bytes.Buffer)
  173.     err := binary.Write(buf, binary.LittleEndian, x)
  174.     if err != nil {
  175.         fmt.Println("Error writing bytes: ", err)
  176.     }
  177.     b := bytes.NewReader(buf.Bytes())
  178.     _ = binary.Read(b, binary.BigEndian, &y)
  179.     return y
  180. }
  181.  
  182. func EncryptRB(srcData []byte) string {
  183.     nblocks := len(srcData) / 16
  184.     var outbs []byte
  185.     initialKey := []uint32{
  186.         0x727167A2,
  187.         0xD1E4033C,
  188.         0x47D4044B,
  189.         0xFD850DD2,
  190.     }
  191.     roundKey := keySchedule(initialKey)
  192.     for i := 0; i < nblocks; i++ {
  193.         low := i * 16
  194.         high := (i + 1) * 16
  195.         blockbs := srcData[low:high]
  196.         var dws [4]uint32
  197.         bb := bytes.NewReader(blockbs)
  198.         _ = binary.Read(bb, binary.LittleEndian, &dws)
  199.  
  200.         // reverse the bits
  201.         var dws2 [4]uint32
  202.         for d := range dws {
  203.             dws2[d] = reverseByteBits(dws[d])
  204.         }
  205.  
  206.         nb := []uint32{
  207.             dws2[3],
  208.             dws2[2],
  209.             dws2[1],
  210.             dws2[0],
  211.         }
  212.  
  213.         buf := new(bytes.Buffer)
  214.  
  215.         for i := range nb {
  216.             err := binary.Write(buf, binary.BigEndian, nb[i])
  217.             if err != nil {
  218.                 fmt.Println("Error writing bytes: ", err)
  219.             }
  220.         }
  221.  
  222.         blockbs = buf.Bytes()
  223.         ia := make([]uint32, len(roundKey))
  224.         for i := range roundKey {
  225.             ia[i] = uint32(roundKey[i])
  226.         }
  227.  
  228.         state := mixRowApplyKey(blockbs, ia)
  229.         nstate := make([]uint32, len(state))
  230.         for i := range state {
  231.             xx := state[i]
  232.             nstate[i] = reverseBytes(xx)
  233.         }
  234.         state = nstate
  235.  
  236.         for j := 0; j < 4; j++ {
  237.             tmpstate := make([]uint32, len(state))
  238.             x := reverseByteBits(mixNibbles(state[2]))
  239.             y := reverseByteBits(rotMess(state[1]))
  240.             z := reverseByteBits(obfuscDword(state[0]))
  241.             w := reverseByteBits(state[3])
  242.             out := x ^ y ^ z ^ w
  243.             bss := new(bytes.Buffer)
  244.             _ = binary.Write(bss, binary.LittleEndian, out)
  245.             bs := bss.Bytes()
  246.             outbs = append(outbs, bs...)
  247.             tmpstate[1] = state[0]
  248.             tmpstate[2] = state[1]
  249.             tmpstate[3] = state[2]
  250.             tmpstate[0] = out
  251.             state = tmpstate
  252.         }
  253.         dws3 := make([]uint32, 4)
  254.         bbl := bytes.NewReader(blockbs)
  255.         _ = binary.Read(bbl, binary.BigEndian, &dws3)
  256.         roundKey = keySchedule(dws3)
  257.     }
  258.  
  259.     rem := len(srcData) % 16
  260.     for i := 0; i < rem; i++ {
  261.         targetIndex := i-1
  262.         targetChar := srcData[:len(srcData)-targetIndex-1]
  263.         ch := targetChar[len(targetChar)-1]
  264.         if rem % 2 == 1 && i == (rem/2) {
  265.             outbs = append(outbs, ch)
  266.             continue
  267.         }
  268.         rev := reverseByteBits(uint32(ch))
  269.         outbs = append(outbs, byte(rev))
  270.     }
  271.     result := fmt.Sprintf("01%02x", outbs)
  272.     return result
  273. }
  274.  
  275. func DecryptRB (encData2 []byte) string {
  276.     encData, _ := hex.DecodeString(string(encData2))
  277.     encData = encData[1:]
  278.     nblocks := len(encData) / 16
  279.     var outbs []byte
  280.     initialKey := []uint32{
  281.         0x727167A2,
  282.         0xD1E4033C,
  283.         0x47D4044B,
  284.         0xFD850DD2,
  285.     }
  286.     roundKey := keySchedule(initialKey)
  287.     for i := 0; i < nblocks; i++ {
  288.         low := i * 16
  289.         high := (i + 1) * 16
  290.         blockbs := encData[low:high]
  291.         var dws [4]uint32
  292.         bb := bytes.NewReader(blockbs)
  293.         _ = binary.Read(bb, binary.LittleEndian, &dws)
  294.         buf := new(bytes.Buffer)
  295.         _ = binary.Write(buf, binary.BigEndian, dws[3])
  296.         _ = binary.Write(buf, binary.BigEndian, dws[2])
  297.         _ = binary.Write(buf, binary.BigEndian, dws[1])
  298.         _ = binary.Write(buf, binary.BigEndian, dws[0])
  299.         blockbs = buf.Bytes()
  300.         state := []uint32{dws[0],dws[1],dws[2],dws[3]}
  301.         for j := 0; j < 4; j++ {
  302.             tmpstate := make([]uint32, len(state))
  303.             x := reverseByteBits(mixNibbles(state[0]))
  304.             y := reverseByteBits(rotMess(state[1]))
  305.             z := reverseByteBits(obfuscDword(state[2]))
  306.             out := reverseByteBits(x^y^z^state[3])
  307.             tmpstate[1] = state[0]
  308.             tmpstate[2] = state[1]
  309.             tmpstate[3] = state[2]
  310.             tmpstate[0] = out
  311.             state = tmpstate
  312.         }
  313.         ts := make([]uint32, len(state))
  314.         for i, x := range state {
  315.             ts[i] = reverseBytes(x)
  316.         }
  317.         state = ts
  318.         for i := range state {
  319.             blockbs = append(blockbs, byte(state[i]))
  320.         }
  321.         buf2 := new(bytes.Buffer)
  322.         for i := range state {
  323.             err := binary.Write(buf2, binary.BigEndian, state[i])
  324.             if err != nil {
  325.                 fmt.Println("Error writing bytes: ", err)
  326.             }
  327.         }
  328.         blockbs = buf2.Bytes()
  329.         s := roundKey
  330.         for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
  331.             s[i], s[j] = s[j], s[i]
  332.         }
  333.         state = mixRowApplyKey(blockbs, s)
  334.         mixed := []uint32{state[3],state[2],state[1],state[0]}
  335.         roundKey = keySchedule(mixed)
  336.         for i := range state {
  337.             state[i] = reverseByteBits(state[i])
  338.         }
  339.         tmpBuffer := new(bytes.Buffer)
  340.         _ = binary.Write(tmpBuffer, binary.LittleEndian, state[0])
  341.         _ = binary.Write(tmpBuffer, binary.LittleEndian, state[1])
  342.         _ = binary.Write(tmpBuffer, binary.LittleEndian, state[2])
  343.         _ = binary.Write(tmpBuffer, binary.LittleEndian, state[3])
  344.         tmpBytes := tmpBuffer.Bytes()
  345.         outbs = append(outbs, tmpBytes...)
  346.     }
  347.     rem := len(encData)%16
  348.     for i := 0; i < rem; i++ {
  349.         targetIndex := i-1
  350.         targetChar := encData[:len(encData)-targetIndex-1]
  351.         ch := targetChar[len(targetChar)-1]
  352.         if rem % 2 == 1 && i == (rem/2) {
  353.             outbs = append(outbs, ch)
  354.             continue
  355.         }
  356.         rev := reverseByteBits(uint32(ch))
  357.         outbs = append(outbs, byte(rev))
  358.     }
  359.     return string(outbs)[4:] // Nuke the first 4 bytes as it's the padding
  360. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement