Advertisement
Falexom

Untitled

Dec 22nd, 2023
1,198
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 1.71 KB | None | 0 0
  1. package main
  2.  
  3. import(
  4.     "fmt"
  5.     "math/rand"
  6.     "strconv"
  7. )
  8.  
  9. func gcd(a, b int) int output{
  10.     if a < b {
  11.         return gcd(b, a)
  12.     }
  13.  
  14.     else if a % b == 0 {
  15.         return b
  16.     }
  17.  
  18.     else {
  19.         return gcd(b, a%b)
  20.     }
  21. }
  22.  
  23. func gen_key(q int) int{
  24.     key := rand.Intn(1, q-1)
  25.     var flag = 0
  26.     for flag != 1 {
  27.         flag := gcd(q, key)
  28.         if flag == 1{
  29.             break
  30.         }
  31.         key := rand.Intn(1, q-1)
  32.     }
  33.     return key
  34. }
  35.  
  36. func power(a, b, c int) int {
  37.     var x = 1
  38.     var y = 2
  39.  
  40.     for b > a {
  41.         if b % 2 != 0 {
  42.             x = (x * y) % c
  43.         }
  44.         y = (y * y) % c
  45.     }
  46.     return x % c
  47. }
  48.  
  49. func encrypt(msg string, q, h, g *big.Int) ([]*big.Int, *big.Int) {
  50.     enMsg := make([]*big.Int, len(msg))
  51.    
  52.     k := genKey(q) // Private key for sender
  53.     s := power(h, k, q)
  54.     p := power(g, k, q)
  55.    
  56.     for i := 0; i < len(msg); i++ {
  57.      enMsg[i] = new(big.Int).SetInt64(int64(msg[i]))
  58.     }
  59.    
  60.     fmt.Println("g^k used:", p)
  61.     fmt.Println("g^ak used:", s)
  62.    
  63.     for i := 0; i < len(enMsg); i++ {
  64.      enMsg[i].Mul(enMsg[i], s)
  65.     }
  66.    
  67.     return enMsg, p
  68.    }
  69.    
  70.  
  71. func decrypt(enMsg []*big.Int, p, key, q *big.Int) string {
  72.     drMsg := make([]byte, len(enMsg))
  73.     h := power(p, key, q)
  74.    
  75.     for i := 0; i < len(enMsg); i++ {
  76.      enMsg[i].Div(enMsg[i], h)
  77.      drMsg[i] = byte(enMsg[i].Int64())
  78.     }
  79.    
  80.     return string(drMsg)
  81.    }
  82.    
  83.  
  84. func main() {
  85.     var msg = []string{"h", "e", "l", "l", "o"}
  86.     var p = rand.Intn(100000000000000000000, 100000000000000000000000000000000000000000000000000)
  87.     var q = rand.Intn(2, p)
  88.     var g = rand.Intn(2, q)
  89.     key := gen_key(q)
  90.     h := power(g, key, q)
  91.     enMsg, p := encrypt(msg, big.NewInt(int64(q)), h, big.NewInt(int64(g)))
  92.     drMsg := decrypt(enMsg, big.NewInt(int64(p)), big.NewInt(int64(key)), big.NewInt(int64(q)))
  93.     fmt.Println(dr_msg)
  94. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement