有没有懂 RSA 的同学,RSA该怎么写啊

我正在用Julia语言写RSA算法,这是我从 算法精解 C语言描述里抄写的代码

struct RSAPubKey
  e::Int
  n::Int
end

struct RSAPriKey
  d::Int
  n::Int
end

function modexp(a::Int, b::Int, n::Int)
  y = 1
  while b != 0
    if b & 1 != 0
      y = (y * a) % n
    end
    a = (a * a) % n
    b = b >> 1
  end

  return y
end

function rsaencipher(plaintext::Int, pubkey::RSAPubKey)
  ciphertext = modexp(plaintext, pubkey.e, pubkey.n)
  return ciphertext
end

function rsadecipher(ciphertext::Int, prikey::RSAPriKey)
  plaintext = modexp(ciphertext, prikey.d, prikey.n)
  return plaintext
end

抄完我有点懵比,别人的RSA在线网站都是这样的

他是输入一个私匙密码后生成公匙和私匙,我这函数该怎么用啊??

你这个就是个 int size 的玩具实现,当然不一样啦。我看你估计连 base64 都不知道

那有没有可以参考的教程?
base64还是知道一点的

你没看你那本书里写的吗,假设 Huge 是个大整数,所以要你自己整个大整数实现。你用 Int 当然只能玩 32 位的。RSA key 就是个用 base64 编码的 2048 bit 长的整数,文本就是用大整数表示的数据。顺带你这展示的网站是生成钥匙对的,又不是加密解密的

我的娘啊,这玩意太费劲了
我再去折腾一下

1 个赞

核心算法的话, wikipedia 就有, 而且任何 cryptography 的教科书估计都有, 楼主不如先查查教科书 :expressionless:

实现上也不需要特别高深的技巧, Julia 本来就有 gcd, powermod 这些函数, 也有 arbitrary-precision 的类型, 基本上看懂原理就能撸一个效果不太差的实现.

首先要找一个或者自己写一个big number的库,剩下的就按公式来就可以了。

你遇到的问题其实是公私钥怎么编码成ASN.1格式 参考这个博客应该能理解Decoding an SSH Key from PEM to BASE64 to HEX to ASN.1 to prime decimal numbers - Scott Hanselman's Blog

另外 你自己实现的方式不一定符合标准的要求 比如标准里面私钥是包含crt优化相关的内容 你可能需要去找下对应的rfc

1 个赞