@@ -2,57 +2,58 @@ package main
2
2
3
3
import (
4
4
//"math/big"
5
- "math/rand "
5
+ "fmt "
6
6
"math"
7
+ "math/rand"
7
8
"time"
8
- "fmt"
9
9
)
10
- func generatePrimes (limit int )int {
10
+
11
+ func generatePrimes (limit int ) int {
11
12
/*
12
- generate primes by factoring
13
- relies on the 30k+i, though better formulae exist
14
- where k >=0 and i = (1,7,11,13,17,13,19,23,29)
13
+ generate primes by factoring
14
+ relies on the 30k+i, though better formulae exist
15
+ where k >=0 and i = (1,7,11,13,17,13,19,23,29)
15
16
*/
16
- primes := prime (limit )
17
+ primes := prime (limit )
17
18
var choice []int
18
- choice = append (choice , 1 ,7 , 11 ,13 ,17 ,19 ,23 ,29 )
19
- for {
20
- k := rand .Intn (int (limit / 30 ))
21
- i := choice [rand .Intn (len (choice ))]
22
- c := 30 * k + i
19
+ choice = append (choice , 1 , 7 , 11 , 13 , 17 , 19 , 23 , 29 )
20
+ for {
21
+ k := rand .Intn (int (limit / 30 ))
22
+ i := choice [rand .Intn (len (choice ))]
23
+ c := 30 * k + i
23
24
found := true
24
- for _ ,v := range primes {
25
- if c % v == 0 {
25
+ for _ , v := range primes {
26
+ if c % v == 0 {
26
27
found = false
27
28
break
28
29
}
29
30
}
30
- if found {
31
+ if found {
31
32
return c
32
33
}
33
34
}
34
35
}
35
- func prime (limit int )(primes []int ){
36
- sqrtLimit := int (math .Ceil (math .Sqrt (float64 (limit ))))
37
- exit := false
38
- primes = append (primes ,2 , 3 , 5 )
39
- lastIndex := 2
40
- for ; primes [lastIndex ]< sqrtLimit ; {
41
- if exit == true {
36
+ func prime (limit int ) (primes []int ) {
37
+ sqrtLimit := int (math .Ceil (math .Sqrt (float64 (limit ))))
38
+ exit := false
39
+ primes = append (primes , 2 , 3 , 5 )
40
+ lastIndex := 2
41
+ for primes [lastIndex ] < sqrtLimit {
42
+ if exit == true {
42
43
break
43
44
}
44
- for i := primes [lastIndex ]+ 2 ; i < primes [lastIndex ]* primes [lastIndex ];i += 2 {
45
- found := true
46
- for _ ,v := range primes {
47
- if i % v == 0 {
48
- found = false
45
+ for i := primes [lastIndex ] + 2 ; i < primes [lastIndex ]* primes [lastIndex ]; i += 2 {
46
+ found := true
47
+ for _ , v := range primes {
48
+ if i % v == 0 {
49
+ found = false
49
50
break
50
51
}
51
52
}
52
- if found {
53
- primes = append (primes ,i )
53
+ if found {
54
+ primes = append (primes , i )
54
55
lastIndex ++
55
- if i >= sqrtLimit {
56
+ if i >= sqrtLimit {
56
57
exit = true
57
58
break
58
59
}
@@ -62,113 +63,111 @@ func prime(limit int)(primes []int){
62
63
}
63
64
return
64
65
}
65
- func lcm (a int , b int )int {
66
+ func lcm (a int , b int ) int {
66
67
//complexity depends on gcd
67
- return int ((a * b ) / gcd (a ,b ))
68
+ return int ((a * b ) / gcd (a , b ))
68
69
69
70
}
70
- func gcd (a int , b int ) int {
71
+ func gcd (a int , b int ) int {
71
72
//complexity not clear
72
- for b != 0 {
73
- t := b
73
+ for b != 0 {
74
+ t := b
74
75
b = a % b
75
76
a = t
76
77
}
77
78
return a
78
79
}
79
- func modularMultiplicativeInverse (e int , delta int )int {
80
+ func modularMultiplicativeInverse (e int , delta int ) int {
80
81
//runs in O(n) where n = delta
81
- e = e % delta
82
- for i := 1 ; i < delta ;i ++ {
83
- if (i * e )% delta == 1 {
82
+ e = e % delta
83
+ for i := 1 ; i < delta ; i ++ {
84
+ if (i * e )% delta == 1 {
84
85
return i
85
86
}
86
87
}
87
88
return 0
88
89
}
89
90
90
- func modularExponentiation (b int , e int , mod int )int {
91
+ func modularExponentiation (b int , e int , mod int ) int {
91
92
//runs in O(log(n)) where n = e
92
- if mod == 1 {
93
+ if mod == 1 {
93
94
return 0
94
95
}
95
- r := 1
96
+ r := 1
96
97
b = b % mod
97
- for ; e > 0 ; {
98
- if e % 2 == 1 {
99
- r = ( r * b ) % mod
98
+ for e > 0 {
99
+ if e % 2 == 1 {
100
+ r = ( r * b ) % mod
100
101
}
101
- e = e >> 1
102
- b = (b * b ) % mod
102
+ e = e >> 1
103
+ b = (b * b ) % mod
103
104
}
104
105
return r
105
106
}
106
107
107
- func encryptRSA (message []int ,e int ,n int )[]int {
108
+ func encryptRSA (message []int , e int , n int ) []int {
108
109
//runs in O(k*log(n)) where k = len(message) and n = e
109
110
var ciphertext []int
110
- for _ ,v := range message {
111
- ciphertext = append (ciphertext , modularExponentiation (v ,e , n ))
111
+ for _ , v := range message {
112
+ ciphertext = append (ciphertext , modularExponentiation (v , e , n ))
112
113
}
113
114
return ciphertext
114
115
}
115
- func decryptRSA (ciphertext []int , d int , n int ) []int {
116
+ func decryptRSA (ciphertext []int , d int , n int ) []int {
116
117
//runs in O(k*log(n)) where k = len(ciphertext) and n = d
117
118
var message []int
118
- for _ ,v := range ciphertext {
119
- message = append (message , modularExponentiation (v ,d , n ))
119
+ for _ , v := range ciphertext {
120
+ message = append (message , modularExponentiation (v , d , n ))
120
121
}
121
122
return message
122
123
}
123
- func toASCII (slice []rune )[]int {
124
+ func toASCII (slice []rune ) []int {
124
125
//runs in O(n) where n = len(slice)
125
126
var converted []int
126
- for _ ,v := range slice {
127
+ for _ , v := range slice {
127
128
converted = append (converted , int (v ))
128
129
}
129
130
return converted
130
131
}
131
132
132
- func toRune (slice []int )string {
133
+ func toRune (slice []int ) string {
133
134
//runs in O(n) where n = len(slice)
134
135
var str string
135
- for _ ,v := range slice {
136
+ for _ , v := range slice {
136
137
str += string (v )
137
138
}
138
139
return str
139
140
}
140
141
141
-
142
- func main (){
142
+ func main () {
143
143
rand .Seed (time .Now ().UTC ().UnixNano ())
144
- bits := 17
144
+ bits := 17
145
145
146
- p := generatePrimes (1 << bits )
147
- q := generatePrimes (1 << bits )
148
- for p == q {
149
- q = generatePrimes (1 << bits )
146
+ p := generatePrimes (1 << bits )
147
+ q := generatePrimes (1 << bits )
148
+ for p == q {
149
+ q = generatePrimes (1 << bits )
150
150
}
151
151
152
- n := p * q
153
-
154
- delta := lcm (p - 1 ,q - 1 )
152
+ n := p * q
155
153
156
- e := generatePrimes (delta )
157
- d := modularMultiplicativeInverse (e ,delta )
154
+ delta := lcm (p - 1 , q - 1 )
158
155
159
- fmt .Printf ("%v \n %v \n %v \n %v\n " ,p ,q ,e ,d )
156
+ e := generatePrimes (delta )
157
+ d := modularMultiplicativeInverse (e , delta )
160
158
159
+ fmt .Printf ("%v \n %v \n %v \n %v\n " , p , q , e , d )
161
160
162
- str := "I think RSA is really great"
161
+ str := "I think RSA is really great"
163
162
message := []rune (str )
164
- asciiSlice := toASCII (message )
165
-
166
- fmt .Printf ("asciiSlice : %v \n " ,asciiSlice )
167
- encrypted := encryptRSA (asciiSlice ,e , n )
168
- fmt .Printf ("encrypted : %v \n " ,encrypted )
169
- decrypted := decryptRSA (encrypted ,d , n )
170
- fmt .Printf ("decrypted : %v \n " ,decrypted )
171
- fmt .Printf ("cleartext : %v \n " ,toRune (decrypted ))
163
+ asciiSlice := toASCII (message )
164
+
165
+ fmt .Printf ("asciiSlice : %v \n " , asciiSlice )
166
+ encrypted := encryptRSA (asciiSlice , e , n )
167
+ fmt .Printf ("encrypted : %v \n " , encrypted )
168
+ decrypted := decryptRSA (encrypted , d , n )
169
+ fmt .Printf ("decrypted : %v \n " , decrypted )
170
+ fmt .Printf ("cleartext : %v \n " , toRune (decrypted ))
172
171
//switched to atom
173
172
174
173
}
0 commit comments