首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >.NET AES/Rijndael -重复使用解密器时的不一致解密

.NET AES/Rijndael -重复使用解密器时的不一致解密
EN

Stack Overflow用户
提问于 2010-07-29 12:48:57
回答 1查看 1.6K关注 0票数 3

我创建了一个使用AES加密和解密的类。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class AesEncryptionProvider {
    #region Fields

    // Encryption key
    private static readonly byte[] s_key = new byte[32] {
        // Omitted...
    };

    // Initialization vector
    private static readonly byte[] s_iv = new byte[16] {
        // Omitted...
    };

    private AesCryptoServiceProvider m_provider;
    private ICryptoTransform m_encryptor;
    private ICryptoTransform m_decryptor;

    #endregion

    #region Constructors

    private AesEncryptionProvider () {
        m_provider = new AesCryptoServiceProvider();
        m_encryptor = m_provider.CreateEncryptor(s_key, s_iv);
        m_decryptor = m_provider.CreateDecryptor(s_key, s_iv);
    }

    static AesEncryptionProvider () {
        Instance = new AesEncryptionProvider();
    }

    #endregion

    #region Properties

    public static AesEncryptionProvider Instance { get; private set; }

    #endregion

    #region Methods

    public string Encrypt (string value) {
        if (string.IsNullOrEmpty(value)) {
            throw new ArgumentException("Value required.");
        }

        return Convert.ToBase64String(
            Transform(
                Encoding.UTF8.GetBytes(value),
                m_encryptor));
    }

    public string Decrypt (string value) {
        if (string.IsNullOrEmpty(value)) {
            throw new ArgumentException("Value required.");
        }

        return Encoding.UTF8.GetString(
            Transform(
                Convert.FromBase64String(value),
                m_decryptor));
    }

    #endregion

    #region Private methods

    private byte[] Transform (byte[] input, ICryptoTransform transform) {
        byte[] output;
        using (MemoryStream memory = new MemoryStream()) {
            using (CryptoStream crypto = new CryptoStream(
                memory,
                transform,
                CryptoStreamMode.Write
            )) {
                crypto.Write(input, 0, input.Length);
                crypto.FlushFinalBlock();

                output = memory.ToArray();
            }
        }
        return output;
    }

    #endregion
}

如您所见,在这两种情况下,我都是通过MemoryStream编写CryptoStream的。如果我在每次对m_provider.CreateDecyptor(s_key, s_iv)的调用中通过Decrypt创建一个新的解密器,它就能正常工作。

这里出了什么问题?为什么解密者表现得好像忘记了IV?对StreamReader.ReadToEnd()的调用是否有助于正确地执行m_decryptor功能?

我想避免我在这里列出的两种“工作”方法中的任何一种,因为这两种方法都有性能上的影响,这是一条非常关键的道路。提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-07-29 14:31:09

好的,我承认我不知道为什么会这样,但是把AesCryptoServiceProvider改为AesManaged和瞧。

我还建议让类实现IDisposable,因为它包含实现它的三个成员变量。有关代码更改,请参见下面:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public sealed class AesEncryptionProvider : IDisposable
{
    // Encryption key
    private static readonly byte[] key = new byte[]
    {
        // Omitted...
    };

    // Initialization vector
    private static readonly byte[] iv = new byte[]
    {
        // Omitted...
    };

    private static readonly AesEncryptionProvider instance = new AesEncryptionProvider();

    private readonly AesManaged provider;

    private readonly ICryptoTransform encryptor;

    private readonly ICryptoTransform decryptor;

    private AesEncryptionProvider()
    {
        this.provider = new AesManaged();
        this.encryptor = this.provider.CreateEncryptor(key, iv);
        this.decryptor = this.provider.CreateDecryptor(key, iv);
    }

    public static AesEncryptionProvider Instance
    {
        get
        {
            return instance;
        }
    }

    public void Dispose()
    {
        this.decryptor.Dispose();
        this.encryptor.Dispose();
        this.provider.Dispose();
        GC.SuppressFinalize(this);
    }

    public string Encrypt(string value)
    {
        if (string.IsNullOrEmpty(value))
        {
            throw new ArgumentException("Value required.");
        }

        return Convert.ToBase64String(Transform(Encoding.UTF8.GetBytes(value), this.encryptor));
    }

    public string Decrypt(string value)
    {
        if (string.IsNullOrEmpty(value))
        {
            throw new ArgumentException("Value required.");
        }

        return Encoding.UTF8.GetString(Transform(Convert.FromBase64String(value), this.decryptor));
    }

    private static byte[] Transform(byte[] input, ICryptoTransform transform)
    {
        using (var memory = new MemoryStream())
        using (var crypto = new CryptoStream(memory, transform, CryptoStreamMode.Write))
        {
            crypto.Write(input, 0, input.Length);
            crypto.FlushFinalBlock();
            return memory.ToArray();
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3366811

复制
相关文章
pytorch: PyTorch中 使用 Tensorboard
因为工作需要,改用pytorch。但如何将训练过程可视化成了大问题。听说pytorch代码中可以插入tensorboard代码,第一反应是居然可以这么玩。。
JNingWei
2018/09/27
3.4K0
pytorch: PyTorch中 使用 Tensorboard
AWS SageMaker Studio Lab免费的机器福利利用起来~
国内无法访问Google Colab,所以有时候跑Python notebook比较麻烦,得倒腾到本地,如果自己的机器(比如笔记本)性能不行的话跑起来也很痛苦
windmaple
2022/03/30
1.1K0
AWS SageMaker Studio Lab免费的机器福利利用起来~
keras使用tensorboard
# 导入库 from keras.callbacks import TensorBoard # 创建tensorboard对象, 结果保存在logs目录下 tensorboard = TensorBoard(log_dir='logs/{}'.format(NAME),histogram_freq=1,write_grads=True) # 在模型生成器函数作为回调参数 model.fit_generator( generator=train_generator, epoc
Spaceack
2020/11/04
4350
让用户使用第三方账号(如亚马逊账号)接入AWS IoT系统
我们想象这么一个IoT应用场景:厂商A使用AWS IoT来开发物联网解决方案,那么A把设备卖给用户的时候,需要使用户能够登入AWS IoT系统来控制其购买的A的设备,也就是说给用户分配适当的权限。下面本文简要概括讨论如何实现这样一个场景。
ascii0x03
2019/05/15
1.6K0
【TensorFlow | TensorBoard】理解 TensorBoard
本文介绍了TensorBoard可视化学习的基础知识,包括什么是TensorBoard、TensorBoard中的Histograms、DISTRIBUTIONS、IMAGES、SCALARS和GRAPHS。同时,还介绍了如何通过TensorBoard可视化学习,包括TensorBoard的WebUI、TensorBoard中的Scalar、Histogram、Image、Audio、Text、Network和Config等可视化组件。通过这些可视化组件,用户可以直观地了解模型的运行状态,以及模型训练过程中的各种指标,从而更好地理解模型的训练过程,进一步优化模型的性能。
Alan Lee
2018/01/08
4.4K0
【TensorFlow | TensorBoard】理解 TensorBoard
Photoshop把AI论文demo打包实现了:照片上色、改年龄、换表情只需要点点鼠标
机器之心报道 编辑:张倩、陈萍 我们见过很多神经网络上色、换表情、修改年龄的研究和应用,但它们往往只存在于 GitHub 上,距离「人人能用」还有一段距离。但最近,推出 Photoshop 的 Adobe 这次终于有所表示了:你们论文里的效果,我们打包实现了。 这两年,我们从很多论文中看到过一些令人惊艳的 demo,比如老照片自动上色、低画质图像秒变高清图像、普通图像一键变梵高风格等。 但对于不写代码、不玩模型的普通人来说,这些 demo 展示的应用还是非常遥远,或者只能从某个 APP 中找到其中一种。因
机器之心
2023/03/29
8360
Photoshop把AI论文demo打包实现了:照片上色、改年龄、换表情只需要点点鼠标
pytorch中tensorboard数据显示
python3.6.9 pytorch1.13.1 cuda10.0 cudnn7.5.1
全栈程序员站长
2021/04/07
1.4K0
27场机器学习面试后,来划个概念重点吧
机器之心报道 编辑:小舟 机器学习面试宝典,有这一本就够了。 在机器学习和数据科学岗位的面试中,机器学习领域的概念是经常考察的内容。一位近期经过 27 次 AI 领域面试(包括 Google 等大型公司和一些初创公司)的开发者根据自己的面试实战经验撰写了一份机器学习资料。 这份资料适用于机器学习初学者,包含机器学习中经典常用的基础概念。值得一提的是,每个章节的末尾还附带教程和练习题,帮助读者进一步掌握书中讲解的概念知识。 下载地址:https://www.confetti.ai/assets/ml-pri
机器之心
2023/03/29
3210
27场机器学习面试后,来划个概念重点吧
使用TensorBoard进行超参数优化
在本文中,我们将介绍超参数优化,然后使用TensorBoard显示超参数优化的结果。
deephub
2020/07/07
1.6K0
使用TensorBoard进行超参数优化
laravel使用aws笔记
一、引入composer "aws/aws-sdk-php": "^3.137", "league/flysystem-aws-s3-v3": "^1.0" 二、添加配置 's3' => [ 'driver' => 's3', 'key' => env('AWS_ACCESS_KEY_ID'), #key 'secret' => env('AWS_SECRET_ACCESS_KEY'), #秘钥 're
苦咖啡
2020/05/12
1.3K0
Docker环境下如何使用TensorBoard
DocKer环境是Linux上启用TensorFlow GPU支持最简单的方法。Docker使用容器创建虚拟环境,将TensorFlow的安装与系统的其余部分隔离开来。TensorFlow程序在虚拟环境中运行,但与主机共享资源(访问目录、使用 GPU、连接到互联网等)。
YoungTimes
2022/04/28
1.9K0
Docker环境下如何使用TensorBoard
PyTorch入门:(二)Tensorboard的使用
可以发现在和代码存放路径同级的路径下会多出一个 logs 的文件夹,文件夹内文件如下:
Here_SDUT
2022/08/08
5400
PyTorch入门:(二)Tensorboard的使用
如何用Amazon SageMaker 做分布式 TensorFlow 训练?(千元亚马逊羊毛可薅)
TensorFlow 是广泛被用于开发大型深度神经网络 (DNN) 的开放源机器学习 (ML) 库,此类 DNN 需要分布式训练,并且在多个主机上使用多个 GPU。Amazon SageMaker 是一项托管服务,可通过主动学习、超参数优化、模型分布式训练、监控训练进展,部署培训模型作为自动扩展的 RESTful 服务,以及对并发 ML 实验进行集中式管理,从标签数据开始简化 ML 工作流。
机器之心
2020/08/07
3.3K0
如何用Amazon SageMaker 做分布式 TensorFlow 训练?(千元亚马逊羊毛可薅)
tensorboard错误 :
最后发现一种很简单的解决方法,只需要指定端口号即可,博主一共试了三个端口号,终于运行成功,生成了网址:
狼啸风云
2019/01/18
1.9K0
引入鲁棒性作为连续参数,这种新的损失函数实现了自适应、随时变换
选自towardsdatascience 作者:Saptashwa Bhattacharyya 机器之心编译 编辑:陈萍 损失函数是机器学习里最基础也是最为关键的一个要素,其用来评价模型的预测值和真实值不一样的程度。最为常见的损失函数包括平方损失、指数损失、log 对数损失等损失函数。这里回顾了一种新的损失函数,通过引入鲁棒性作为连续参数,该损失函数可以使围绕最小化损失的算法得以推广,其中损失的鲁棒性在训练过程中自动自我适应,从而提高了基于学习任务的性能。 这篇文章对 CVPR 2019 的一篇论文《A
机器之心
2023/03/29
6400
引入鲁棒性作为连续参数,这种新的损失函数实现了自适应、随时变换
亚马逊推出新的机器学习芯片Inferentia;提供数据标记服务;全新GPU instance
亚马逊宣布推出一款由AWS设计的芯片Inferentia,专门用于部署带有GPU的大型AI模型,该芯片预计于明年推出。
AiTechYun
2018/12/24
8190
亚马逊推出新的机器学习芯片Inferentia;提供数据标记服务;全新GPU instance
在python中使用SageMaker Debugger进行机器学习模型的开发调试
如果你从事软件开发,你就会知道 Bug 是生活的一部分。当你开始你的项目时,Bug 就可能存在,当你把你的产品交付给客户时,Bug 也可能存在。在过去的几十年中,软件开发社区已经开发了许多的技术工具、IDE、代码库等来帮助开发者尽早地发现 Bug,以避免在产品交付的时候仍旧存在 Bug。
deephub
2020/05/09
1.3K0
在python中使用SageMaker Debugger进行机器学习模型的开发调试
为非专业人员量身打造,斯坦福教授Christopher Manning一页纸定义AI核心概念
机器之心报道 编辑:魔王、小舟 斯坦福教授 Christopher Manning 用一页纸的篇幅介绍 AI 领域的核心概念。 在「AI」随处可见的当下,你真的理解人工智能领域核心概念吗? 刚刚,斯坦福大学教授、人工智能实验室(SAIL)负责人、HAI 副主任 Christopher Manning 用一页纸的篇幅定义了 AI 领域的核心术语。他表示希望这些定义能够帮助非专业人员理解 AI。 在这一页纸中,Manning 介绍了十多个术语的定义,包括「智能」、「人工智能」、「机器学习」、「深度学习」等。
机器之心
2023/03/29
3610
为非专业人员量身打造,斯坦福教授Christopher Manning一页纸定义AI核心概念
点击加载更多

相似问题

调试Google play服务

10

使用Eclipse "Play“按钮调试游戏服务

12

如何使用Play!2.0调试测试

32

如何使用我的android应用程序自动安装google play服务

20

如何使用android调试android应用程序

31
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文