Windows Server 2003下RSA加密遭遇”该项不适与在指定状态下使用”的错误的解决办法

        今天使用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加密和解密类,供广大伸手党们享用!

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; ;
            }
        }
    }
}




  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深蓝静音

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值