当前位置: 代码迷 >> C# >> 生手求教-加解密
  详细解决方案

生手求教-加解密

热度:172   发布时间:2016-05-05 04:32:57.0
新手求教-加解密
public static string REG(string name)
{
    string str3;
    try
    {
        string xmlString = "<RSAKeyValue><Modulus>lL3bbCNd5/ZRSQb+p1pgY4KVna8/gxHY1WuFjN/uVOPCQOncC+6zilzNyChY3dIv+mG1rHXJ3W+e/jp6iJTtjOdlViLhulNcAjIsjyk5266cZOToDEcxH+mHtRAFBx78pkWfvwckEoi7SXHTGo1n39dxZHnUX3JsWN/N/gVSamk=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";
        string regcode ="smX8v0uMk+KAftq4CZqJtMi6yYwWBJ9u9lrcDjo9PDhvbIQ2mPADGjdsj8AktT1QlNzavdK9iT5VDJ1Om/4UGvDW3bzSeXZRrTWlnBD3Mm62twIe/fZSfMOO0N+7v6T1dqWS+myVlf+K8opoBI3hg04BMpJg5+69H/oZsJmhPwI=";//读取配置文件的
        using (RSACryptoServiceProvider provider = new RSACryptoServiceProvider())
        {
            provider.FromXmlString(xmlString);
            RSAPKCS1SignatureDeformatter deformatter = new RSAPKCS1SignatureDeformatter(provider);
            deformatter.SetHashAlgorithm("SHA1");
            byte[] rgbSignature = Convert.FromBase64String(regcode);
            byte[] rgbHash = new SHA1Managed().ComputeHash(Encoding.ASCII.GetBytes(name));//已知name为0001C0WNPAA0INJ0201
            if (deformatter.VerifySignature(rgbHash, rgbSignature))
            {
                return "1";
            }
            str3 = "0";
        }
    }
    catch (Exception)
    {
        str3 = "0";
    }
    return str3;
}

以上程序怎么算出regcode啊!
------解决思路----------------------
验证用RSAPKCS1SignatureDeformatter,只需要公钥,即xmlString中的<Modulus>和<Exponent>部分。
创建则用RSAPKCS1SignatureFormatter,需要密钥。


class Program
{
    static string xmlString = 
        "<RSAKeyValue><Modulus>lJbx69u3TC7gqTYzhOg4Ly77hKARiVjmF6Mjl5+JhmzlSxOMyxE3wBOQfsbNSD4RkxyP0nWeBrxLqkBZ7fTrIWae" + 
        "YPut8aa1JyUWS+IxiiMoAaCY9SCz7W9/+5PGkRaw9P4P0UFSQY+b/tkQnxMwu/QjhLmcKOzs/qF45MZFkRc=</Modulus><Exponent>AQAB</Exponent>" +
        "<P>wxdqxYQNBAXMeve6O6eYAMx1RvbG1ksfZIga067oqLuGzw0nAf1hAnsnFPe3etorvepOawhg48aJvoWxbfT4vQ==</P><Q>wvrkgfp0pd8n" + 
        "qjfR7l15AjJQYo0CPElG9sOC/FvCYKKXal5Dr3DXrAIMF9EnEO59HQXwm7pt1Ze4UZu/KrTgYw==</Q><DP>sTc4WitV122dDaaymTXoMfGIJu" +
        "pMPKUI4z1vgRLFbWDLWJHN+VS9Jo/QNI/BL+u3CFEq4rc9rCrRPSwcvJFm0Q==</DP><DQ>thFsAYdrF1yrAELBkHDOR2PONkhv9vWCA3kLvjS" + 
        "87FnHRDcjwxZ+/gqnWjIe5audPtXGGNTcLSBQqDvkJa/i+w==</DQ><InverseQ>j2kRFgaI+spUi8gJuFqAOcsWt6Y1AiB8eWE+dZpzxUNEsH" + 
        "NgFvij4GgGM2ZRHbiHgFfclBXvUQkePp3h9yG4Aw==</InverseQ><D>MfBROl3LyvTuWLB4vDB3wZPewIIzop+YJVWU/r6FsAIlRgg6B32v6Q" +
        "QqShFyqNcDfRfaVndlNwpNu9iI4OqxozMKoGCYmOC08I8E9GZnvAXNFfRCz12nxvRJbUH9gqHzt267eiTeFQXkHbu3GcPofJK5orErT5+IV2PZqpgxf7E=</D></RSAKeyValue>";

    static void Main(string[] args)
    {
        // 为用户hello创建一个注册码
        string regcode = CreateRegcode("hello");

        // 核实用户hello提交的注册码
        bool ok1 = VerifyRegcode("hello", regcode);  // true
        bool ok2 = VerifyRegcode("HELLO", regcode);  // false
    }

    static string CreateRegcode(string name)
    {
        using (RSACryptoServiceProvider provider = new RSACryptoServiceProvider())
        {
            provider.FromXmlString(xmlString);
            byte[] rgbHash = new SHA1Managed().ComputeHash(Encoding.ASCII.GetBytes(name));
            RSAPKCS1SignatureFormatter RSAFormatter = new RSAPKCS1SignatureFormatter(provider);
            RSAFormatter.SetHashAlgorithm("SHA1");
            byte[] rgbSignature = RSAFormatter.CreateSignature(rgbHash);
            return Convert.ToBase64String(rgbSignature);
        }
    }

    static bool VerifyRegcode(string name, string regcode)
    {
        using (RSACryptoServiceProvider provider = new RSACryptoServiceProvider())
        {
            provider.FromXmlString(xmlString);
            RSAPKCS1SignatureDeformatter deformatter = new RSAPKCS1SignatureDeformatter(provider);
            deformatter.SetHashAlgorithm("SHA1");
            byte[] rgbSignature = Convert.FromBase64String(regcode);
            byte[] rgbHash = new SHA1Managed().ComputeHash(Encoding.ASCII.GetBytes(name));
            return deformatter.VerifySignature(rgbHash, rgbSignature);
        }
    }
}
  相关解决方案