【问题标题】:encode in windows decode in linux在 windows 中编码 在 linux 中解码
【发布时间】:2015-12-15 15:23:51
【问题描述】:

我创建了(或多或少从网络重写)最短的程序来编码和解码字符串。

namespace crypto
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private static string Encrypt(string toEncrypt, bool useHashing)
    {
        byte[] keyArray;
        byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);
        System.Configuration.AppSettingsReader settingsReader = new AppSettingsReader();
        string key = (string)settingsReader.GetValue("SecurityKey", typeof(String));
        if (useHashing)
        {
            MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
            keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
            hashmd5.Clear();
        }
        else
            keyArray = UTF8Encoding.UTF8.GetBytes(key);

        TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
        tdes.Key = keyArray;
        tdes.Mode = CipherMode.ECB;
        tdes.Padding = PaddingMode.PKCS7;
        ICryptoTransform cTransform = tdes.CreateEncryptor();
        byte[] resultArray =
        cTransform.TransformFinalBlock(toEncryptArray, 0,
        toEncryptArray.Length);
        tdes.Clear();
        return Convert.ToBase64String(resultArray, 0, resultArray.Length);
    }

    private static string Decrypt(string cipherString, bool useHashing)
    {
        byte[] keyArray;
        byte[] toEncryptArray = Convert.FromBase64String(cipherString);
        System.Configuration.AppSettingsReader settingsReader = new AppSettingsReader();
        string key = (string)settingsReader.GetValue("SecurityKey", typeof(String));
        if (useHashing)
        {
            MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
            keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
            hashmd5.Clear();
        }
        else
        {
            keyArray = UTF8Encoding.UTF8.GetBytes(key);
        }
        TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
        tdes.Key = keyArray;
        tdes.Mode = CipherMode.ECB;
        tdes.Padding = PaddingMode.PKCS7;
        ICryptoTransform cTransform = tdes.CreateDecryptor();
        try
        {
            byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
            return UTF8Encoding.UTF8.GetString(resultArray);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
            return null;
        }
        finally
        {
            tdes.Clear();
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
            this.rtfENC.Text = Encrypt(this.rtfDEC.Text, true);
            this.rtfDEC.Text = "";
    }

    private void button2_Click(object sender, EventArgs e)
    {
        this.rtfDEC.Text = Decrypt(this.rtfENC.Text, true);
        this.rtfENC.Text = "";
    }


}

它只有两种方法 Decrypt 和 Encrypt ,它按我的预期工作。我想知道我是否可以在 Linux 中创建具有完全相同功能的程序/脚本。或者也许更好的问题是如何做到这一点? bash 适合吗?我需要任何特殊/外部库、包吗?会不会很困难?

【问题讨论】:

  • Linux中有MONO。
  • 清除 bash/ksh/csh 或其他脚本语言怎么样?
  • @zaph 如果答案有帮助,我(几乎)总是接受它。
  • 建议:回顾你过去的答案,有几个似乎很适合接受。顺便说一句,几天后您可以接受自己的答案。我不是在谈论我的答案,它主要是最佳实践建议。

标签: decode encode


【解决方案1】:

该方法不是很安全。

  1. 3DES 不应该用于新工作,使用 AES。
  2. 如果派生密钥 MD5 不安全,请使用 PKBKDF2。
  3. 不要使用 ECB 模式,它不安全,使用带有随机 iv 的 CBC,将 iv 预先添加到加密数据中。
  4. 使用长度完全正确的键,不要依赖任何默认填充。

大多数语言至少包含一些加密功能,而 AES 是当前标准。如果可能的话,找到一个经过 FIPS 认证并且具有硬件支持的芯片,合理的当前 Intel 芯片具有与 A 系列芯片一样的支持。硬件支持速度可以轻松提高 500 到 1000 倍。

脚本语言的问题,在某种程度上,总体而言,是保持加密密钥的安全。

最后,加密本身和/或不与最佳实践一起使用不会产生太多安全性,更不用说安全性的错觉。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 2020-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-22
    • 1970-01-01
    相关资源
    最近更新 更多