如何将明文VNC密码加密为Remmina兼容的加密格式?
搞定Remmina兼容的VNC密码加密(C#实现)
嘿,我仔细看了你的问题和提供的解密Python脚本,现在帮你反向推导加密逻辑,给出能直接用的C#实现——毕竟你已经走通了SSH传文件、启动Remmina的流程,就差这最后一步加密密码了!
先拆解Remmina的加密规则
从你给的解密脚本能看出,Remmina的密码加密是这么玩的:
- 密钥和IV从哪来:树莓派上Remmina的加密密钥存在
~/.config/remmina/remmina.pref里的secret字段,是个Base64字符串。解码后:- 前24字节是3DES的密钥(3DES标准就是用24字节密钥)
- 后8字节是CBC模式的初始化向量IV(DES/3DES的块大小是8字节,IV必须和块大小一样长)
- 加密的步骤:
- 明文密码先做PKCS#5填充(因为你的解密脚本直接出明文,说明加密时用了标准填充,PKCS#5在8字节块大小下和PKCS#7是一回事)
- 用3DES-CBC模式,拿上面的密钥和IV加密
- 加密后的字节数组转成Base64,就是
.remmina文件里要填的密码值
直接能用的C#代码
下面是完整的C#实现,连测试示例都给你写好了,对应你提供的解密脚本的参数,跑起来就能得到你示例里的加密结果:
using System; using System.Security.Cryptography; using System.Text; public class RemminaPasswordTool { public static string EncryptRemminaPassword(string plainPassword, string base64RemminaSecret) { // 解码Remmina的base64密钥 byte[] secretBytes = Convert.FromBase64String(base64RemminaSecret); // 拆分出3DES密钥和IV byte[] key = new byte[24]; byte[] iv = new byte[8]; Array.Copy(secretBytes, 0, key, 0, 24); Array.Copy(secretBytes, 24, iv, 0, 8); // 初始化3DES加密器 using (TripleDES des = TripleDES.Create()) { des.Key = key; des.IV = iv; des.Mode = CipherMode.CBC; des.Padding = PaddingMode.PKCS7; // 和PKCS#5兼容,适配Remmina的填充逻辑 ICryptoTransform encryptor = des.CreateEncryptor(); // 把明文转成UTF-8字节(Remmina用UTF-8存密码) byte[] plainBytes = Encoding.UTF8.GetBytes(plainPassword); // 执行加密 byte[] encryptedBytes = encryptor.TransformFinalBlock(plainBytes, 0, plainBytes.Length); // 转成Base64字符串返回 return Convert.ToBase64String(encryptedBytes); } } // 测试用例:对应你给的解密脚本参数 public static void Main() { string remminaSecret = "9c+QkAz49dY5PIuphZjJWFQwq72tvcwD4/QXFtxIkNE="; string plainPwd = "333333"; string encryptedPwd = EncryptRemminaPassword(plainPwd, remminaSecret); Console.WriteLine(encryptedPwd); // 应该输出: Rk/hk6y5CmE= } }
几个要注意的点
- 密钥要拿对:每个树莓派上的Remmina
secret都是唯一的,别拿错了!你可以通过SSH在树莓派上执行cat ~/.config/remmina/remmina.pref | grep secret直接获取这个Base64字符串。 - 编码别错:Remmina用UTF-8处理密码,所以C#里一定要用
Encoding.UTF8转换明文,不然加密出来的密码会乱码,Remmina识别不了。 - 填充模式:C#里的
PaddingMode.PKCS7和Python那边的PKCS#5填充在8字节块大小下完全一致,直接用就行,不用改。 - 3DES模式:C#的
TripleDES默认就是EDE模式(加密-解密-加密),和Python的Crypto.Cipher.DES3默认模式匹配,不用额外配置。
怎么集成到你的流程里
- 先通过SSH从树莓派拿到
remmina.pref里的secret值,存到你的C#应用里(或者每次执行时动态获取)。 - 调用上面的
EncryptRemminaPassword方法,把明文VNC密码转成加密后的Base64字符串。 - 生成
.remmina配置文件,关键字段填对:protocol=VNC、server=你的Windows PC IP、password=加密后的Base64字符串,其他字段(比如name)按需填。 - 通过SSH把生成的
.remmina文件传到树莓派的~/.local/share/remmina/目录,然后执行remmina -c /path/to/你的配置文件.remmina就能一键启动VNC连接,完全不会弹框要密码!
内容的提问来源于stack exchange,提问作者Mohsen K




