- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
C#.NET Framework 使用BC库(BouncyCastle) RSA 公钥加密 私钥解密 ver:20230706 。
。
环境说明:
.NET Framework 4.6 的控制台程序 .
。
2020年以后 ,有部分PKCS8私钥(openssl生成)无法用RsaUtil.LoadPrivateKey(strPriPkcs8, "PKCS8")来解析 (https://www.cnblogs.com/runliuv/p/17474269.html) 。
可以尝试用BC库来处理.
另外,在.NET中:私钥加密,公钥解密。也只能用BC库实现。 。
。
加密解析:
//假设私钥长度为1024, 1024/8-11=117。 //如果明文的长度小于117,直接全加密,然后转base64。(data.Length <= maxBlockSize) //如果明文长度大于117,则每117分一段加密,写入到另一个Stream中,最后转base64.
。
如果要和其它语言互通,这个分段长度需要和其它语言约定好,不一是 私钥长度/8-11.
。
解密解析:
//假设私钥长度为1024, 1024/8 =128。 //如果明文的长度小于 128,直接全解密。(data.Length <= maxBlockSize) //如果明文长度大于 128,则每 128 分一段解密,写入到另一个Stream中,最后 GetString.
。
用“支付宝开放平台开发助手”生成一组公私钥:
PKCS8私钥:
MIICeQIBADANBgkqhkiG9w0BAQEFAASCAmMwggJfAgEAAoGBAMz0Czg6QUtTISa2pUkloeQB/TEpHdqrfyroWpKLW9B/LWFSOGH9nyTk1pPZaeadyEZQ6gay/C0pUAetLraq9bMA/Luxq68b87uG7WX7dKytEO2/87qGpGMRs97H+GlkzWil2QO2KK4cHnAcVicPsmi5aZ72U0BWJFyPhtd+qdmrAgMBAAECgYEAvW67iAbgHt0BASVD9C3iSjpEaVHVlC165o/IVzaTcEx8Bz3Ve0zN8W3JnvIO3ebsG4HiLLr2Nk++9rltOc0eNeGMv7F1e/OFot1wN0ON6s1g4bYh1z5Uz8FcYiMWcqHHICrx+oSFeK9x+I2Zge7enQXcsVnqEhm77ZE5YczSryECQQD9nB58e5efYchF+cYbmURioX18cUMuhQbB9Aq2N55cd689Lg35KZqT8JQTp/8tQSdCJG8d2nU8VKspUKTEAuaDAkEAzuKIIoc9PVJvy90LhIPA9c1S8BPCI7EMCaTZqJ5o3VaR2dqvUZDGX7kL3kYkQ+n7mq3KIECvkEFzA+FOP96XuQJBAJQTKHW0T/YeSKoayUHp/lS8R6F2HCy4PRbXn71+wfbpZqcJEd2OHhQM3tiPOV258esbjMlYeSUNppZL4LgVnXMCQQC7Lvs9Ql+GPDAqo7ToEM1lmICR906QPIBHuX+1sJ3wpYMROWumwPa7ZRH36j6ls+6R5OwcgmpWeuE1gYTrBNsBAkEAn2pEtAljX1foQff6CLozYg/J6J9RmVFcJ6qz0LX3052qNFBQYw8CMHB7VkVNzsDIDC8LX5uP2pzTrdPLew+pPA== 。
与之匹配的 PKCS1 私钥,用助手转换的:
MIICXwIBAAKBgQDM9As4OkFLUyEmtqVJJaHkAf0xKR3aq38q6FqSi1vQfy1hUjhh/Z8k5NaT2WnmnchGUOoGsvwtKVAHrS62qvWzAPy7sauvG/O7hu1l+3SsrRDtv/O6hqRjEbPex/hpZM1opdkDtiiuHB5wHFYnD7JouWme9lNAViRcj4bXfqnZqwIDAQABAoGBAL1uu4gG4B7dAQElQ/Qt4ko6RGlR1ZQteuaPyFc2k3BMfAc91XtMzfFtyZ7yDt3m7BuB4iy69jZPvva5bTnNHjXhjL+xdXvzhaLdcDdDjerNYOG2Idc+VM/BXGIjFnKhxyAq8fqEhXivcfiNmYHu3p0F3LFZ6hIZu+2ROWHM0q8hAkEA/ZwefHuXn2HIRfnGG5lEYqF9fHFDLoUGwfQKtjeeXHevPS4N+Smak/CUE6f/LUEnQiRvHdp1PFSrKVCkxALmgwJBAM7iiCKHPT1Sb8vdC4SDwPXNUvATwiOxDAmk2aieaN1Wkdnar1GQxl+5C95GJEPp+5qtyiBAr5BBcwPhTj/el7kCQQCUEyh1tE/2HkiqGslB6f5UvEehdhwsuD0W15+9fsH26WanCRHdjh4UDN7YjzldufHrG4zJWHklDaaWS+C4FZ1zAkEAuy77PUJfhjwwKqO06BDNZZiAkfdOkDyAR7l/tbCd8KWDETlrpsD2u2UR9+o+pbPukeTsHIJqVnrhNYGE6wTbAQJBAJ9qRLQJY19X6EH3+gi6M2IPyeifUZlRXCeqs9C199OdqjRQUGMPAjBwe1ZFTc7AyAwvC1+bj9qc063Ty3sPqTw= 。
与之匹配的公钥:
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDM9As4OkFLUyEmtqVJJaHkAf0xKR3aq38q6FqSi1vQfy1hUjhh/Z8k5NaT2WnmnchGUOoGsvwtKVAHrS62qvWzAPy7sauvG/O7hu1l+3SsrRDtv/O6hqRjEbPex/hpZM1opdkDtiiuHB5wHFYnD7JouWme9lNAViRcj4bXfqnZqwIDAQAB 。
。
BCSignUtil 辅助类,nuget 中引用 Portable.BouncyCastle.
using Org.BouncyCastle.Crypto; using Org.BouncyCastle.Crypto.Encodings; using Org.BouncyCastle.Crypto.Engines; using Org.BouncyCastle.Security; using System; using System.IO; using System.Text; namespace CommonUtils { public static class BCSignUtil { /// <summary> /// 签名 /// </summary> /// <param name="orgData"> 原数据字符串 </param> /// <param name="privateKeyPKCS8"> 必须是PKCS8的 </param> /// <param name="algorithm"> 算法 </param> /// <returns></returns> public static string SignData( string orgData, string privateKeyPKCS8, string algorithm) { if ( string .IsNullOrEmpty(orgData)) throw new Exception( " 字符串不能为空! " ); if ( string .IsNullOrEmpty(privateKeyPKCS8)) throw new Exception( " privateKeyPKCS8不能为空! " ); if ( string .IsNullOrEmpty(privateKeyPKCS8)) throw new Exception( " algorithm 不能为空! " ); AsymmetricKeyParameter priKey = GetPrivateKeyParameter(privateKeyPKCS8); byte [] byteData = Encoding.UTF8.GetBytes(orgData); ISigner normalSig = SignerUtilities.GetSigner(algorithm); normalSig.Init( true , priKey); normalSig.BlockUpdate(byteData, 0 , byteData.Length); // 注意:是byte数组和数组长度,别写成string的长度了 byte [] normalResult = normalSig.GenerateSignature(); // 签名结果 string sign = Convert.ToBase64String(normalResult); return sign; } private static AsymmetricKeyParameter GetPrivateKeyParameter( string privateKeyPem) { // 获取私钥纯字符串 privateKeyPem = privateKeyPem.Replace( " -----BEGIN RSA PRIVATE KEY----- " , "" ).Replace( " -----END RSA PRIVATE KEY----- " , "" ).Replace( " \r " , "" ).Replace( " \n " , "" ).Trim(); privateKeyPem = privateKeyPem.Replace( " -----BEGIN PRIVATE KEY----- " , "" ).Replace( " -----END PRIVATE KEY----- " , "" ).Replace( " \r " , "" ).Replace( " \n " , "" ).Trim(); byte [] privateInfoByte = Convert.FromBase64String(privateKeyPem); AsymmetricKeyParameter priKey = PrivateKeyFactory.CreateKey(privateInfoByte); return priKey; } /// <summary> /// 验证签名 /// </summary> /// <param name="orgData"> 原数据字符串 </param> /// <param name="publicKeyPem"> 公钥 </param> /// <param name="responseSign"> 对方的签名串 </param> /// <param name="algorithm"> 算法 </param> /// <returns></returns> public static bool VerifySignature( string orgData, string publicKeyPem, string responseSign, string algorithm) { AsymmetricKeyParameter pubKey = GetPublicKeyParameter(publicKeyPem); byte [] signBytes = Convert.FromBase64String(responseSign); byte [] plainBytes = Encoding.UTF8.GetBytes(orgData); ISigner verifier = SignerUtilities.GetSigner(algorithm); verifier.Init( false , pubKey); verifier.BlockUpdate(plainBytes, 0 , plainBytes.Length); // 注意:是byte数组和数组长度,别写成string的长度了 bool isOK = verifier.VerifySignature(signBytes); // 验签结果 return isOK; } private static AsymmetricKeyParameter GetPublicKeyParameter( string publicKeyPem) { // 获取公钥纯字符串 publicKeyPem = publicKeyPem.Replace( " -----BEGIN PUBLIC KEY----- " , "" ).Replace( " -----END PUBLIC KEY----- " , "" ).Replace( " \r " , "" ).Replace( " \n " , "" ).Trim(); byte [] publicInfoByte = Convert.FromBase64String(publicKeyPem); AsymmetricKeyParameter pubKey = PublicKeyFactory.CreateKey(publicInfoByte); return pubKey; } /// <summary> /// RSA加密 /// </summary> /// <param name="orgData"> 数据 </param> /// <param name="key"> 私钥、公钥 </param> /// <param name="isPublicKey"> 是否为公钥 </param> /// <param name="privateKeySize"> 私钥长度,一般是1024或2048 </param> /// <returns></returns> public static string EncryptByKey( string orgData, string key, bool isPublicKey, int privateKeySize) { // 非对称加密算法,加解密用 IAsymmetricBlockCipher engine = new Pkcs1Encoding( new RsaEngine()); // 加密 // 1024长度是117,双方协商好 int maxBlockSize = privateKeySize / 8 - 11 ; // 加密块最大长度限制 engine.Init( true , isPublicKey ? GetPublicKeyParameter(key) : GetPrivateKeyParameter(key)); byte [] byteData = System.Text.Encoding.UTF8.GetBytes(orgData); int inputLen = byteData.Length; MemoryStream ms = new MemoryStream(); int offSet = 0 ; byte [] cache; int i = 0 ; // 对数据分段加密 while (inputLen - offSet > 0 ) { if (inputLen - offSet > maxBlockSize) { cache = engine.ProcessBlock(byteData, offSet, maxBlockSize); } else { cache = engine.ProcessBlock(byteData, offSet, inputLen - offSet); } ms.Write(cache, 0 , cache.Length); i ++ ; offSet = i * maxBlockSize; } byte [] encryptedData = ms.ToArray(); // var ResultData = engine.ProcessBlock(byteData, 0, byteData.Length); return Convert.ToBase64String(encryptedData); // Console.WriteLine("密文(base64编码):" + Convert.ToBase64String(testData) + Environment.NewLine); } /// <summary> /// RSA解密 /// </summary> /// <param name="orgData"> 数据 </param> /// <param name="key"> 私钥、公钥 </param> /// <param name="isPublicKey"> 是否为公钥 </param> /// <param name="privateKeySize"> 私钥长度,一般是1024或2048 </param> /// <returns></returns> public static string DecryptByKey( string orgData, string key, bool isPublicKey, int privateKeySize) { orgData = orgData.Replace( " \r " , "" ).Replace( " \n " , "" ).Replace( " " , "" ); // 非对称加密算法,加解密用 IAsymmetricBlockCipher engine = new Pkcs1Encoding( new RsaEngine()); // 解密 // 1024长度是128,双方协商好 int maxBlockSize = privateKeySize / 8 ; // 解密块最大长度限制 engine.Init( false , isPublicKey ? GetPublicKeyParameter(key) : GetPrivateKeyParameter(key)); byte [] byteData = Convert.FromBase64String(orgData); int inputLen = byteData.Length; MemoryStream ms = new MemoryStream(); int offSet = 0 ; byte [] cache; int i = 0 ; // 对数据分段加密 while (inputLen - offSet > 0 ) { if (inputLen - offSet > maxBlockSize) { cache = engine.ProcessBlock(byteData, offSet, maxBlockSize); } else { cache = engine.ProcessBlock(byteData, offSet, inputLen - offSet); } ms.Write(cache, 0 , cache.Length); i ++ ; offSet = i * maxBlockSize; } byte [] encryptedData = ms.ToArray(); // var ResultData = engine.ProcessBlock(byteData, 0, byteData.Length); return Encoding.UTF8.GetString(ms.ToArray()); // Console.WriteLine("密文(base64编码):" + Convert.ToBase64String(testData) + Environment.NewLine); } } }
。
使用代码:
。
using CommonUtils; using System; namespace ConsoleNetFxRsa加密签名使用BC库 { class Program { static void Main( string [] args) { try { // PKCS8格式私钥 string strPriPkcs8 = " MIICeQIBADANBgkqhkiG9w0BAQEFAASCAmMwggJfAgEAAoGBAMz0Czg6QUtTISa2pUkloeQB/TEpHdqrfyroWpKLW9B/LWFSOGH9nyTk1pPZaeadyEZQ6gay/C0pUAetLraq9bMA/Luxq68b87uG7WX7dKytEO2/87qGpGMRs97H+GlkzWil2QO2KK4cHnAcVicPsmi5aZ72U0BWJFyPhtd+qdmrAgMBAAECgYEAvW67iAbgHt0BASVD9C3iSjpEaVHVlC165o/IVzaTcEx8Bz3Ve0zN8W3JnvIO3ebsG4HiLLr2Nk++9rltOc0eNeGMv7F1e/OFot1wN0ON6s1g4bYh1z5Uz8FcYiMWcqHHICrx+oSFeK9x+I2Zge7enQXcsVnqEhm77ZE5YczSryECQQD9nB58e5efYchF+cYbmURioX18cUMuhQbB9Aq2N55cd689Lg35KZqT8JQTp/8tQSdCJG8d2nU8VKspUKTEAuaDAkEAzuKIIoc9PVJvy90LhIPA9c1S8BPCI7EMCaTZqJ5o3VaR2dqvUZDGX7kL3kYkQ+n7mq3KIECvkEFzA+FOP96XuQJBAJQTKHW0T/YeSKoayUHp/lS8R6F2HCy4PRbXn71+wfbpZqcJEd2OHhQM3tiPOV258esbjMlYeSUNppZL4LgVnXMCQQC7Lvs9Ql+GPDAqo7ToEM1lmICR906QPIBHuX+1sJ3wpYMROWumwPa7ZRH36j6ls+6R5OwcgmpWeuE1gYTrBNsBAkEAn2pEtAljX1foQff6CLozYg/J6J9RmVFcJ6qz0LX3052qNFBQYw8CMHB7VkVNzsDIDC8LX5uP2pzTrdPLew+pPA== " ; // PKCS1格式私钥 string strPriPkcs1 = " MIICXwIBAAKBgQDM9As4OkFLUyEmtqVJJaHkAf0xKR3aq38q6FqSi1vQfy1hUjhh/Z8k5NaT2WnmnchGUOoGsvwtKVAHrS62qvWzAPy7sauvG/O7hu1l+3SsrRDtv/O6hqRjEbPex/hpZM1opdkDtiiuHB5wHFYnD7JouWme9lNAViRcj4bXfqnZqwIDAQABAoGBAL1uu4gG4B7dAQElQ/Qt4ko6RGlR1ZQteuaPyFc2k3BMfAc91XtMzfFtyZ7yDt3m7BuB4iy69jZPvva5bTnNHjXhjL+xdXvzhaLdcDdDjerNYOG2Idc+VM/BXGIjFnKhxyAq8fqEhXivcfiNmYHu3p0F3LFZ6hIZu+2ROWHM0q8hAkEA/ZwefHuXn2HIRfnGG5lEYqF9fHFDLoUGwfQKtjeeXHevPS4N+Smak/CUE6f/LUEnQiRvHdp1PFSrKVCkxALmgwJBAM7iiCKHPT1Sb8vdC4SDwPXNUvATwiOxDAmk2aieaN1Wkdnar1GQxl+5C95GJEPp+5qtyiBAr5BBcwPhTj/el7kCQQCUEyh1tE/2HkiqGslB6f5UvEehdhwsuD0W15+9fsH26WanCRHdjh4UDN7YjzldufHrG4zJWHklDaaWS+C4FZ1zAkEAuy77PUJfhjwwKqO06BDNZZiAkfdOkDyAR7l/tbCd8KWDETlrpsD2u2UR9+o+pbPukeTsHIJqVnrhNYGE6wTbAQJBAJ9qRLQJY19X6EH3+gi6M2IPyeifUZlRXCeqs9C199OdqjRQUGMPAjBwe1ZFTc7AyAwvC1+bj9qc063Ty3sPqTw= " ; // 公钥 string strPub = " MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDM9As4OkFLUyEmtqVJJaHkAf0xKR3aq38q6FqSi1vQfy1hUjhh/Z8k5NaT2WnmnchGUOoGsvwtKVAHrS62qvWzAPy7sauvG/O7hu1l+3SsrRDtv/O6hqRjEbPex/hpZM1opdkDtiiuHB5wHFYnD7JouWme9lNAViRcj4bXfqnZqwIDAQAB " ; string strDJM = " 泰酷拉!123ABC " ; // 待签名字符串 strDJM = " 泰酷拉!123ABC泰酷拉!123ABC泰酷拉!123ABC泰酷拉!123ABC泰酷拉!123ABC泰酷拉!123ABC泰酷拉!123ABC泰酷拉!123ABC泰酷拉!123ABC泰酷拉!123ABC泰酷拉!123ABC泰酷拉!123ABC泰酷拉!123ABC泰酷拉!123ABC泰酷拉!123ABC泰酷拉!123ABC泰酷拉!123ABC " ; // 待加密字符串,超过117字符的测试 Console.WriteLine( " 待签名字符串: " + strDJM); #region 1、私钥签名 // string algorithm = "SHA1withRSA"; string algorithm = " SHA256withRSA " ; string strSigned = BCSignUtil.SignData(strDJM, strPriPkcs8, algorithm); // PKCS8 Console.WriteLine( " 签名值: " + strSigned); #endregion #region 2、公钥验签(验证签名) // 2、公钥验签(验证签名) // 验证签名 bool bCheck = BCSignUtil.VerifySignature(strDJM, strPub, strSigned, algorithm); // 验证签名双方要保持一致 Console.WriteLine( " 验证签名: " + bCheck.ToString()); #endregion
//私钥长度,常用 1024 或 2048 int privateKeySize = 1024 ; // 公钥加密 string strJiamihou= BCSignUtil.EncryptByKey(strDJM, strPub, true , privateKeySize); Console.WriteLine( " 加密后: " + strJiamihou); // 私钥解密 string strJiemihou = BCSignUtil.DecryptByKey(strJiamihou, strPriPkcs8, false , privateKeySize); Console.WriteLine( " 解密后: " + strJiemihou); // 私钥加密 strJiamihou = BCSignUtil.EncryptByKey(strDJM, strPriPkcs8, false , privateKeySize); Console.WriteLine( " 私钥加密后: " + strJiamihou); // 公钥解密 strJiemihou = BCSignUtil.DecryptByKey(strJiamihou, strPub, true , privateKeySize); Console.WriteLine( " 公钥解密后: " + strJiemihou); } catch (Exception ex) { Console.WriteLine( " ex: " + ex.Message); } Console.WriteLine( " hello END. " ); Console.ReadKey(); } } }
。
这里演示了2组:
1:公钥加密,私钥解密.
2:私钥加密,公钥解密.
最后此篇关于C#.NETFramework使用BC库(BouncyCastle)RSA公钥加密私钥解密ver:20230706的文章就讲到这里了,如果你想了解更多关于C#.NETFramework使用BC库(BouncyCastle)RSA公钥加密私钥解密ver:20230706的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在使用框架的对象编写一个用于加密/解密的简单库。方法如下: public static byte[] Encrypt(byte[] key, byte[] vector, byte[] input
据我所知,RIM Crypto API 似乎只提供用于对称加密 (3Des) 的 PKCS5 填充模式。我正在使用 JDE 4.6.0。 我正在尝试为黑莓应用程序提供密码学,该应用程序需要与已经使用标
我已经获得了用于加密的 Java 实现,但遗憾的是我们是一家 .net 商店,我无法将 Java 整合到我们的解决方案中。可悲的是,我也不是 Java 专家,所以我已经为此苦苦挣扎了几天,我想我终于可
我正在尝试使用 KMS 和 AWS 加密 SDK 加密数据。查看 AWS documentation 中提供的示例,似乎没有地方可以明确设置数据 key 。 我找到了 EncryptionMateri
我目前有一个用于为我的网站制作哈希的代码,该代码使用 SALT 进行哈希处理,因此密码是不可逆的...... 目前它是 100% 为我的网站工作,它是使用 ASP.NET(C#) 编码的 这是我的代码
我想要做的是在 javascript 中生成一个 key 对,并在 PHP 中使用这些加密,然后用 JS 解密。 我在附加的代码中有两个问题 它不会从装甲文本块重新加载私钥 并且它不会解密 PHP 加
在进行密码哈希时,我有以下 node.js 代码。 body.password = covid@19 salt = "hello@world" body.passwordhex = crypto.cr
我想知道的是在配置文件中加密连接字符串的明确方法。以下是我的问题: 使用机器级加密,访问我的服务器的任何人都不能编写一个小的 .Net 程序来读取连接字符串的内容吗? 如果我将我的应用程序部署到企业环
我知道 rsync 可以在文件传输期间启用/禁用 ssh 加密协议(protocol)。那么,如果 ssh 加密协议(protocol)被禁用了,是不是意味着 rsync 根本不做任何加密呢? 另外,
脚本必须搜索网页内的字符串。但该脚本不应显示它正在搜索的字符串。我的意思是搜索字符串应该采用加密格式或任何其他格式。但如果没有该搜索字符串,则不应显示网页或应在页面上显示错误。 我要开发一个插件。如果
我正在尝试加密 MySQL 上的某些字段。我正在使用 TPC-DS 的 v2.8 版本,并尝试在客户地址表的某些列上使用 AES。知道如何加密字段的所有行吗?我尝试使用 UPDATE customer
我需要一个简单的 javascript 函数,它允许我使用 key 加密 textarea 数据( key 是存储为散列 session 变量的用户密码,由 PHP 打印到字段中) 我基本上希望在用户
如何在 JavaScript 中散列/加密字符串值?我需要一种机制来隐藏 localStorage/cookie 中的一些数据吗? 这与安全问题有关,但我想为我的数据提供一些保护。 最佳答案 有很多
我有一个程序,其中数据库的密码由远程用户设置。该程序将用户名和密码保存到 xml 文件中的加密字符串中,否则应该是人类可读的。现在,这工作正常,我使用带有 key 的 C# DES 加密,它被加密和解
Kotlin 中是否有任何关于椭圆曲线加密的信息? 用于生成 key 对和加密、解密消息。 关于这个主题的信息很少甚至没有。 例如,我想实现 ECC P-521 椭圆曲线。 是否可以在 Kotlin
所以我知道 MD5 在技术上是新应用程序的禁忌,但我随机想到了这个: 自 md5($password); 不安全,不会 md5(md5($password)) 是更好的选择?我使用它的次数越多,它会变
我一直在努力使用 crypto_secretbox_easy() 在 libsodium 中加密/解密一些数据| .我似乎找不到关于使用的任何好的文档。 我想从用户那里获取密码,用它来以某种方式制作
我正在做一个加密项目 视频,我对这个程序有几个问题。 我用命令转码mp4至HLS与 ts段持续时间约为 10 秒。 首先,我需要使用数据库中的 key 加密这些视频。然而, 我不知道是否使用 ffmp
我有一个加密/复制保护问题。 我正在为使用加密狗的公司编写应用程序。请不要告诉我软件保护是没有用的,或者我应该让它自由地飞向空中,或者我花任何时间这样做都是浪费;这不是关于软件保护有效性的哲学问题,更
我对 有一个疑问VIM 加密 key . 我有一个文本文件,我使用加密该文件 :X 现在,加密 key 的存储位置(路径)。 无论是存储在单独的文件中还是存储在文本文件本身中。 如果我打开文件,它会询
我是一名优秀的程序员,十分优秀!