我正在使用 C# 和标准加密库根据 RFC4716(或者至少我认为是这样)生成一个 4096 位的 RSA key ,但是 git hub 说我有一个大小错误的 key ,当我尝试添加时返回以下错误它到与我的帐户关联的 key 。



这是生成 key 的代码:

public static void GenerateKeys() 
    { 
        // Create the CspParameters object and set the key container    
        // name used to store the RSA key pair.   
        CspParameters cp = new CspParameters(); 
        //cp.KeyContainerName = ContainerName; 
 
        CspKeyContainerInfo info = new CspKeyContainerInfo(cp); 
        //string filename = info.UniqueKeyContainerName; 
 
        // Create a new instance of RSACryptoServiceProvider that accesses   
        // the key container MyKeyContainerName.   
        RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(4096, cp); 
        var test = rsa.KeySize; 
 
        using (StreamWriter privateKeyWriter = new StreamWriter(GitStandard.PrivateSSHKeyPath)) 
        { 
            ExportPrivateKey(rsa, privateKeyWriter); 
        } 
 
        using (StreamWriter publicKeyWriter = new StreamWriter(GitStandard.PublicSSHKeyPath)) 
        { 
 
            ExportPublicKeyOpenSSH(rsa, publicKeyWriter); 
        } 
    } 

方法 ExportPublicKeyOpenSSH是对 this thread with answers on how to convert the key to RFC4716 中的代码的一个小修改,我唯一不同的是在模数转换之前添加一个零 (0)。
private static void ExportPublicKeyOpenSSH(RSACryptoServiceProvider csp, TextWriter outputStream) 
        { 
            var parameters = csp.ExportParameters(false); 
 
 
            byte[] sshrsa_bytes = Encoding.Default.GetBytes("ssh-rsa"); 
            //initializing modulus array 
            byte[] n = new Byte[parameters.Modulus.Length + 1]; 
            //adding initial zero before modulus to conform with OpenSSH 
            n[0] = 0; 
            System.Buffer.BlockCopy(parameters.Modulus, 0, n, 1, parameters.Modulus.Length); 
            //byte[] n = parameters.Modulus; 
            byte[] e = parameters.Exponent; 
            System.Array.Resize<Byte>(ref n, n.Length + 1); 
            string base64; 
            using (var stream = new MemoryStream()) 
            { 
                stream.Write(ToBytes(sshrsa_bytes.Length), 0, 4); 
                stream.Write(sshrsa_bytes, 0, sshrsa_bytes.Length); 
                stream.Write(ToBytes(e.Length), 0, 4); 
                stream.Write(e, 0, e.Length); 
                stream.Write(ToBytes(n.Length), 0, 4); 
                stream.Write(n, 0, n.Length); 
                stream.Flush(); 
                base64 = Convert.ToBase64String(stream.ToArray()); 
            } 
            var result = string.Format("ssh-rsa {0}", base64); 
            outputStream.Write(result); 
        } 

生成的 key 是什么样的

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAgD171Y9VeinRALRfU8adS2K0vYHGfKkQwqs8SOQbhURFNtazupsocmpW96dYF346UVVCiKQCYrCW6t0QpGE3ch7onqTvXBszA9mfcuLX9hlhesJqFyUTHxDUopCc2tc5fWYuZ4MeySKuOetBEmPfN3Eu+SWC8j3VS9YzIDjwhkBPcJoxOnv3l7pSxEzGBGQXwdGmL8TFxxsBhue1ajralYPXgJo1nra70ChHcr8PfJvIXigBYCkwnb0KuofbPyhHETo4fNJqCPa1rLjnKoz5iTpyak2SWnhD5FX0/t4juaL/OKNE4YSaAqpWwA9VS1i+y7doeSRc22tm5LHgSLmlxg6h5lPKm5emB840eMLOPvZLS/4uODzFPMo4NFC2ZwNwdlXhcQE9EVtz9EZox1isKpJgShqJPh0sHVH9RnCuBSxW5N79KtsvcXI2zAiLBczKukqU2rTkvYdV1Wkx4zHSvLe42PQuJvSwhwW1tlgyFemd2aRwGDltQyGTPNOZ28E6SGgvxYtB4nvcu8gLyxob4Hz3ysohDB0Z9ZEismSK/8eSeMrBPosTBO77tsjUk1L8v2lHXQ+p1raLpd3ETeae7vZjt6zMFCIhNKDvdJL9b0mIKLB26PMhWG4DzSTJGeIANjiNryWK7y0gdgdPs5953H1EJVRQ0wd2ceFFg2+kpqlrQA=



使用命令 ssh-keygen -l -f custom_rsa.pub测试 key 的有效性。
$ ssh-keygen -l -f custom_rsa.pub 
4104 SHA256:uGO4sHOXXuX1waf+8jrdsWr3/57npF5AuUKUgYVWbCI no comment (RSA) 

请您参考如下方法:

您调整大小 n既要在左侧添加 0(通过从索引 1 开始手动复制到其中),又要在右侧添加 0(通过 Array.Resize )。后一个可能会让你陷入困境。

另外,(不相关的)你可能不应该使用 Encoding.Default ,而是您想要的任何编码。 Encoding.ASCII , 大概。


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!