一个关于capicom加密解密的比较难的问题。


背景:
CAPICOM的全名是Cryptographic API Component Object Model,是微软的Windows操作系统里的元件。为了支持密码编译功能,微软在 Windows API 之中加入了 Cryptographic API (CryptoAPI)[1],然而 CryptoAPI 的使用方法相当复杂,为了简化 CryptoAPI 的使用,微软即将它以 COM 的方式包装成 CAPICOM[2],让应用程序只需要利用 COM 调用方式,即可使用 CryptoAPI。

前提:
MSDN中,提供了一个使用Cryptographic API进行加密和解密的例子,位置是:
security/example_c_program_decrypting_a_file.htm
security/example_c_program_encrypting_a_file.htm

提问:
我使用security/example_c_program_encrypting_a_file.htm中的例子将一个文件加密,是否能提供CAPICOM的程序,将该文件解密呢?


10 个解决方案

#1


看你用什么方式加密。

如果采用当前用户的密钥容器中的密钥来加密,则该用户可以解密。
如果用固定的密码加密,则用该密码可以解密。

注:C#可以直接用System.Security.Cryptography命名空间下的类库而不必用C++程序。

#2


使用固定的密码解密,使用CryptoAPI做这些事情都没问题。
使用CAPICOM也应该能解密CryptoAPI的文件,但我就是不知道脚本怎么写。
麻烦了。

#3


支持

#4


MSDN上的例子

using System;
using System.Security.Cryptography;
using System.Text;
using System.IO;

class RijndaelSample
{

    static void Main()
    {
        try
        {
            // Create a new Rijndael object to generate a key
            // and initialization vector (IV).
            Rijndael RijndaelAlg = Rijndael.Create();

            // Create a string to encrypt.
            string sData = "Here is some data to encrypt.";
            string FileName = "CText.txt";

            // Encrypt text to a file using the file name, key, and IV.
            EncryptTextToFile(sData, FileName, RijndaelAlg.Key, RijndaelAlg.IV);

            // Decrypt the text from a file using the file name, key, and IV.
            string Final = DecryptTextFromFile(FileName, RijndaelAlg.Key, RijndaelAlg.IV);

            // Display the decrypted string to the console.
            Console.WriteLine(Final);
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }

        Console.ReadLine();
    }

    public static void EncryptTextToFile(String Data, String FileName, byte[] Key, byte[] IV)
    {
        try
        {
            // Create or open the specified file.
            FileStream fStream = File.Open(FileName, FileMode.OpenOrCreate);

            // Create a new Rijndael object.
            Rijndael RijndaelAlg = Rijndael.Create();

            // Create a CryptoStream using the FileStream 
            // and the passed key and initialization vector (IV).
            CryptoStream cStream = new CryptoStream(fStream,
                RijndaelAlg.CreateEncryptor(Key, IV),
                CryptoStreamMode.Write);

            // Create a StreamWriter using the CryptoStream.
            StreamWriter sWriter = new StreamWriter(cStream);

            try
            {
                // Write the data to the stream 
                // to encrypt it.
                sWriter.WriteLine(Data);
            }
            catch (Exception e)
            {
                Console.WriteLine("An error occurred: {0}", e.Message);
            }
            finally
            {
                // Close the streams and
                // close the file.
                sWriter.Close();
                cStream.Close();
                fStream.Close();
            }
        }
        catch (CryptographicException e)
        {
            Console.WriteLine("A Cryptographic error occurred: {0}", e.Message);
        }
        catch (UnauthorizedAccessException e)
        {
            Console.WriteLine("A file error occurred: {0}", e.Message);
        }

    }

    public static string DecryptTextFromFile(String FileName, byte[] Key, byte[] IV)
    {
        try
        {
            // Create or open the specified file. 
            FileStream fStream = File.Open(FileName, FileMode.OpenOrCreate);

            // Create a new Rijndael object.
            Rijndael RijndaelAlg = Rijndael.Create();

            // Create a CryptoStream using the FileStream 
            // and the passed key and initialization vector (IV).
            CryptoStream cStream = new CryptoStream(fStream,
                RijndaelAlg.CreateDecryptor(Key, IV),
                CryptoStreamMode.Read);

            // Create a StreamReader using the CryptoStream.
            StreamReader sReader = new StreamReader(cStream);

            string val = null;

            try
            {
                // Read the data from the stream 
                // to decrypt it.
                val = sReader.ReadLine();


            }
            catch (Exception e)
            {
                Console.WriteLine("An error occurred: {0}", e.Message);
            }
            finally
            {

                // Close the streams and
                // close the file.
                sReader.Close();
                cStream.Close();
                fStream.Close();
            }

            // Return the string. 
            return val;
        }
        catch (CryptographicException e)
        {
            Console.WriteLine("A Cryptographic error occurred: {0}", e.Message);
            return null;
        }
        catch (UnauthorizedAccessException e)
        {
            Console.WriteLine("A file error occurred: {0}", e.Message);
            return null;
        }
    }
}

#5


to:cpio

1 MSDN上C代码的加密算法是RC4,而.net中好像没有提供这个加解密算法。
2 MSDN上C代码加解密之前首先将密码进行了MD5散列,使用该散列作为真正的密码进行加解密,而你给出的例子好像不是。

#6


LZ,不厚道,我以为是模拟器呢。。。

#7


该回复于2009-04-07 10:42:19被版主删除

#8


to:simonezhlx
啥模拟器啊。

#9


微软CAPICOM安装之后就有各种语言的调用例子啊
QQ:476833461

#10


up
智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告