RosettaCodeData/Task/RSA-code/V-(Vlang)/rsa-code.v

93 lines
2.8 KiB
Coq
Raw Permalink Normal View History

2023-07-01 11:58:00 -04:00
/*import math.big
fn main() {
//var bb, ptn, etn, dtn big.Int
pt := "Rosetta Code"
2026-04-30 12:34:36 -04:00
println("Plain text: $pt")
2023-07-01 11:58:00 -04:00
// a key set big enough to hold 16 bytes of plain text in
// a single block (to simplify the example) and also big enough
// to demonstrate efficiency of modular exponentiation.
2026-04-30 12:34:36 -04:00
n := big.integer_from_string("9516311845790656153499716760847001433441357")!
e := big.integer_from_string("65537")!
d := big.integer_from_string("5617843187844953170308463622230283376298685")!
2023-07-01 11:58:00 -04:00
mut ptn := big.zero_int
// convert plain text to a number
for b in pt.bytes() {
bb := big.integer_from_i64(i64(b))
2026-04-30 12:34:36 -04:00
ptn = ptn.left_shift(8).bitwise_or(bb)
2023-07-01 11:58:00 -04:00
}
if ptn >= n {
println("Plain text message too long")
return
}
2026-04-30 12:34:36 -04:00
println("Plain text as a number: $ptn")
2023-07-01 11:58:00 -04:00
// encode a single number
2026-04-30 12:34:36 -04:00
etn := ptn.big_mod_pow(e,n)!
println("Encoded: $etn")
2023-07-01 11:58:00 -04:00
// decode a single number
2026-04-30 12:34:36 -04:00
mut dtn := etn.big_mod_pow(d,n)!
println("Decoded: $dtn")
2023-07-01 11:58:00 -04:00
// convert number to text
mut db := [16]u8{}
mut dx := 16
bff := big.integer_from_int(0xff)
for dtn.bit_len() > 0 {
dx--
bb := dtn.bitwise_and(bff)
db[dx] = u8(i64(bb.int()))
2026-04-30 12:34:36 -04:00
dtn = dtn.right_shift(8)
2023-07-01 11:58:00 -04:00
println('${db[0..].bytestr()} ${dtn.bit_len()}')
}
println("Decoded number as text: ${db[dx..].bytestr()}")
2026-04-30 12:34:36 -04:00
}
*/
2023-07-01 11:58:00 -04:00
import math.big
fn main() {
//var bb, ptn, etn, dtn big.Int
pt := "Hello World"
2026-04-30 12:34:36 -04:00
println("Plain text: $pt")
2023-07-01 11:58:00 -04:00
// a key set big enough to hold 16 bytes of plain text in
// a single block (to simplify the example) and also big enough
// to demonstrate efficiency of modular exponentiation.
2026-04-30 12:34:36 -04:00
n := big.integer_from_string("9516311845790656153499716760847001433441357")!
e := big.integer_from_string("65537")!
d := big.integer_from_string("5617843187844953170308463622230283376298685")!
2023-07-01 11:58:00 -04:00
mut ptn := big.zero_int
// convert plain text to a number
for b in pt.bytes() {
bb := big.integer_from_i64(i64(b))
2026-04-30 12:34:36 -04:00
ptn = ptn.left_shift(8).bitwise_or(bb)
2023-07-01 11:58:00 -04:00
}
if ptn >= n {
println("Plain text message too long")
return
}
2026-04-30 12:34:36 -04:00
println("Plain text as a number: $ptn")
2023-07-01 11:58:00 -04:00
// encode a single number
2026-04-30 12:34:36 -04:00
etn := ptn.big_mod_pow(e,n)!
println("Encoded: $etn")
2023-07-01 11:58:00 -04:00
// decode a single number
2026-04-30 12:34:36 -04:00
mut dtn := etn.big_mod_pow(d,n)!
println("Decoded: $dtn")
2023-07-01 11:58:00 -04:00
// convert number to text
mut db := [16]u8{}
mut dx := 16
bff := big.integer_from_int(0xff)
for dtn.bit_len() > 0 {
dx--
bb := dtn.bitwise_and(bff)
db[dx] = u8(i64(bb.int()))
2026-04-30 12:34:36 -04:00
dtn = dtn.right_shift(8)
2023-07-01 11:58:00 -04:00
}
println("Decoded number as text: ${db[dx..].bytestr()}")
}