Windows Server 2003下RSA加密遭遇”该项不适与在指定状态下使用”的错误的解决办法
2012-07-23 22:48
435 查看
今天使用RSA加密遇到了点问题,之前正常的程序突然无法正常加密和解密,无奈之下,尽然在用户的机器上安装了开发环境,跟踪代码。还好有所发现,令人费解的是之前正常的RSA加密解密程序再每次执行加密或解密时,到”new RSACryptoServiceProvider“一句,就会出现“该项不适与在指定状态下使用”的错误。询问用户最近对计算机所做的更改,得知他们给机器设置了操作系统密码。
之前只知道RSA加密跟机器、操作系统、用户、用户密码等密切相关,一台机器下加密的文件,拷贝到另一台机器上是无法解密的,不同用户,同样的加密算法是不会得出相同结果的,另外,即使是同一用户,如果更改了操作系统密码,加密后的字符串也会无法解密。既然用户更改了密码,那么一定跟这个有关系了。不过为什么改密码会导致程序无法运行呢?这个问题确实很奇怪。用户提议说把软件卸了重装可能就好了,我想稍微长点脑子的人,也会明白这是多么可笑的方案,当然,用户是无知的,建议是善意的,我们不能伤用户的心。明白自己的程序重装后还是那么些文件,所以就赶紧上网搜索吧。果然中招的不止我一人,很快就在这里找到些许线索http://www.pin5i.com/showtopic.aspx?forumid=179&forumpage=1&topicid=21865&go=next,不出所料,出现这个问题,正是因为修改了密码。
那位pin5i上发帖子的博主基本说明白了问题,也给出了解决办法。出现这个问题,就是因为你使用的是RSA加密,而修改密码会导致一些系统信息丢失,面对这种信息的丢失,微软的“狗血"策略是通过禁止访问这些信息来保证安全,于是就出现了 ”C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA“目录始终只读的问题。在pin5i中,博主提供的解决方案是恢复密码或者删除”C:\Documents and Settings\All
Users\Application Data\Microsoft\Crypto“目录,可惜这两种方案都不适用于我的情况。首先恢复密码是不可能的,并且用户那边出于安全考虑,要求每隔一段时间就更换一次密码。其次,如果删除这个目录,可能会引发用户机器中其它模块的问题。因此,必须另辟蹊径。
当然,这里需要肯定的是恢复密码的方案确实是可以解决问题的,这是老夫我实验验证过的,后人若再有遇到,可以信我一言,不必再浪费时间。下面说说问题怎么解决的吧!这还得归功于恢复密码的解决方案,正是因为我尝试恢复密码,引出了了一个对话框,让敏感的我一下子就发现了问题!因为是事后记载没有截图,所以就叙述一下吧。我是在控制面板,计算机管理,本地用户和组哪里修改的用户密码,就在更改密码的时候,弹出一个提示,大概意思是”如果你忘记密码,那么你在这里重置密码,否则就按Ctr+Alt+del,在哪里选择修改密码,要不然,一些重要的安全信息将会失效,系统会使这些信息不可用以确保系统安全“。既然如此,那就尝试一下人家微软告诉你的正确的更换密码的途径。第一步,恢复密码到先前软件好使时的状态,果然,软件恢复正常了。下一步,果断按下Ctr+Alt+del,果然,弹出的对话框,左下角有个”修改密码“的按钮,不用说,在哪里要求输入旧密码,
然后设置新密码。然后重启计算机,实验,顺利通过!回头想一下,很明显,按下Ctr+Alt+del修改密码和在本地用户和组哪里修改密码是不一样的,在哪里不需要输入旧密码,这或许就是差异吧,原因在pin5i中,那位博主已经找到了,我在此粘贴一下,供后人参考:
The most common issue in this area occurs when a local (non-domain) user's password is administratively reset. On WinXP or 2K3, this causes all data protected by DPAPI (including user private keys) to be lost; at least until the
password is set back. This is by design, and in fact is an important security feature。
备注:以上操作是基于Windows Server 2003的,Xp下的操作是不一样的,请参考以上信息,只要按照正确的方式修改密码,都可以避免此类问题发生。
最后,附上RSA加密和解密类,供广大伸手党们享用!
之前只知道RSA加密跟机器、操作系统、用户、用户密码等密切相关,一台机器下加密的文件,拷贝到另一台机器上是无法解密的,不同用户,同样的加密算法是不会得出相同结果的,另外,即使是同一用户,如果更改了操作系统密码,加密后的字符串也会无法解密。既然用户更改了密码,那么一定跟这个有关系了。不过为什么改密码会导致程序无法运行呢?这个问题确实很奇怪。用户提议说把软件卸了重装可能就好了,我想稍微长点脑子的人,也会明白这是多么可笑的方案,当然,用户是无知的,建议是善意的,我们不能伤用户的心。明白自己的程序重装后还是那么些文件,所以就赶紧上网搜索吧。果然中招的不止我一人,很快就在这里找到些许线索http://www.pin5i.com/showtopic.aspx?forumid=179&forumpage=1&topicid=21865&go=next,不出所料,出现这个问题,正是因为修改了密码。
那位pin5i上发帖子的博主基本说明白了问题,也给出了解决办法。出现这个问题,就是因为你使用的是RSA加密,而修改密码会导致一些系统信息丢失,面对这种信息的丢失,微软的“狗血"策略是通过禁止访问这些信息来保证安全,于是就出现了 ”C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA“目录始终只读的问题。在pin5i中,博主提供的解决方案是恢复密码或者删除”C:\Documents and Settings\All
Users\Application Data\Microsoft\Crypto“目录,可惜这两种方案都不适用于我的情况。首先恢复密码是不可能的,并且用户那边出于安全考虑,要求每隔一段时间就更换一次密码。其次,如果删除这个目录,可能会引发用户机器中其它模块的问题。因此,必须另辟蹊径。
当然,这里需要肯定的是恢复密码的方案确实是可以解决问题的,这是老夫我实验验证过的,后人若再有遇到,可以信我一言,不必再浪费时间。下面说说问题怎么解决的吧!这还得归功于恢复密码的解决方案,正是因为我尝试恢复密码,引出了了一个对话框,让敏感的我一下子就发现了问题!因为是事后记载没有截图,所以就叙述一下吧。我是在控制面板,计算机管理,本地用户和组哪里修改的用户密码,就在更改密码的时候,弹出一个提示,大概意思是”如果你忘记密码,那么你在这里重置密码,否则就按Ctr+Alt+del,在哪里选择修改密码,要不然,一些重要的安全信息将会失效,系统会使这些信息不可用以确保系统安全“。既然如此,那就尝试一下人家微软告诉你的正确的更换密码的途径。第一步,恢复密码到先前软件好使时的状态,果然,软件恢复正常了。下一步,果断按下Ctr+Alt+del,果然,弹出的对话框,左下角有个”修改密码“的按钮,不用说,在哪里要求输入旧密码,
然后设置新密码。然后重启计算机,实验,顺利通过!回头想一下,很明显,按下Ctr+Alt+del修改密码和在本地用户和组哪里修改密码是不一样的,在哪里不需要输入旧密码,这或许就是差异吧,原因在pin5i中,那位博主已经找到了,我在此粘贴一下,供后人参考:
The most common issue in this area occurs when a local (non-domain) user's password is administratively reset. On WinXP or 2K3, this causes all data protected by DPAPI (including user private keys) to be lost; at least until the
password is set back. This is by design, and in fact is an important security feature。
备注:以上操作是基于Windows Server 2003的,Xp下的操作是不一样的,请参考以上信息,只要按照正确的方式修改密码,都可以避免此类问题发生。
最后,附上RSA加密和解密类,供广大伸手党们享用!
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Security; using System.Security.Cryptography; namespace Encrypt { public class Encrypter { /// <summary> /// 加密方法 /// </summary> public static bool RSAEncryption(string plaintext, out string sResult) { sResult = ""; try { CspParameters param = new CspParameters(); param.KeyContainerName = "SOFTTEST"; using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(param)) { //string plaintext = this.tbData.Text; //获取需要加密的字符串 byte[] plaindata = System.Text.Encoding.Default.GetBytes(plaintext); //将字符串转换为字节数组 byte[] encryptdata = rsa.Encrypt(plaindata, false); //加密内容和加密后的内容都必须是字节数组 sResult = Convert.ToBase64String(encryptdata); //将加密后的字节数字转换为字符串 return true; } } catch { return false; } } /// <summary> /// 解密方法 /// </summary> public static bool RSADecryption(string encryptstring, out string sResult) { sResult = ""; try { CspParameters param = new CspParameters(); param.KeyContainerName = "SOFTTEST"; using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(param)) { byte[] encryptdata = Convert.FromBase64String(encryptstring); //将需要解密的字符串转换为字节数组 byte[] decryptdata = rsa.Decrypt(encryptdata, false); //解密内容和解密后的内容都必须是字节数组 sResult = System.Text.Encoding.Default.GetString(decryptdata); //将解密后字节数组转换为字符串 return true; } } catch { return false; ; } } } }
相关文章推荐
- VS2005问题 该项不适于在指定状态下使用 解决办法
- Windows Server 2003 使用vSphere5.5连接ESXI5.5 “客户端无法向服务器发送完整的请求” 的解决办法
- 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接 错误解决办法
- IOS 使用AF网络请求统一RSA加密+URL不识别中文的解决办法
- 验证视图状态 MAC 失败。如果此应用程序由网络场或群集承载,请确保 配置指定了相同的 validationKey 和验证算法。不能在群集中使用 AutoGenerate 的解决办法
- C:\Windows\system32\MSVCR100.dll 没有被指定在 Windows 上运行,或者它包含错误。请尝试使用原始安装媒体重新安装程序,或联系您的系统管理员或软件供应商以获取支持。【解决办法】
- "磁盘或网络错误"或未使用Jet时返回"指定错误"解决办法
- 安装JDK提示: 该项不适于在指定状态下使用的错误
- win7中如何解决“该项不适用于在指定状态下使用”
- [数据库] windows server 2003下mysql出现10048错误的解决办法 Can't connect to MySQL server on '127.0.0.1' (10048)
- Windows Server 2003 Update 错误号:0×8007041D 出错解决办法
- SQLSERVER2005的10054错误在Windows Server 2003 SP1上的解决办法
- win7中如何解决“该项不适用于在指定状态下使用”
- win7中如何解决“该项不适用于在指定状态下使用”
- win7中如何解决“该项不适用于在指定状态下使用”
- win7中如何解决“该项不适用于在指定状态下使用”
- 验证视图状态 MAC 失败。如果此应用程序由网络场或群集承载,请确保 配置指定了相同的 validationKey 和验证算法。不能在群集中使用 AutoGenerate 的解决办法
- 在VS2005中报"无法添加数据库连接 该项目不适于在指定状态下使用"的解决办法
- vs.NET 错误:该项不适于在指定状态下使用
- win7中如何解决“该项不适用于在指定状态下使用”