- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想在 Portable Class Library Contrib project on codeplex 中使用密码学但没有找到任何关于如何使用它的文档。
我想创建一个包含 Encrypt
和 Decrypt
方法的包装类,我希望这个包装类存在于可移植类库中。我在这个项目中引用了 Portable.Runtime
和 Portable.Security.Cryptography
。这是正确的吗?
然后我想在 .NET、Windows Phone 和 Metro 项目中使用我的包装器。在这些项目中,我引用了我的包装器项目 Portable.Runtime
、Portable.Security.Cryptography
和相应的 Portable 项目,即 Portable.Desktop
、Portable.Phone
或 Portable.WindowsStore
。这是正确的吗?
但是,当我尝试使用我的包装器类时,出现命名空间冲突错误。这是错误和我的包装器类:
The type
System.Security.Cryptography.AesManaged
exists in bothC:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\Profile\Client\System.Core.dll
andC:\Downloads\PclContrib\bin\Debug\Portable.Security.Cryptography.dll
public sealed class SymmetricCryptography<T> where T : SymmetricAlgorithm, new()
{
private readonly T provider = new T();
private readonly UTF8Encoding utf8 = new UTF8Encoding();
private byte[] key;
private byte[] iv;
public byte[] Key
{
get { return this.key; }
}
public byte[] IV
{
get { return this.iv; }
}
public SymmetricCryptography()
{
this.key = this.provider.Key;
this.iv = this.provider.IV;
}
public SymmetricCryptography(byte[] key, byte[] iv)
{
this.key = key;
this.iv = iv;
}
public SymmetricCryptography(string password, string salt)
{
Rfc2898DeriveBytes deriveBytes = new Rfc2898DeriveBytes(password, this.utf8.GetBytes(salt));
this.key = deriveBytes.GetBytes(this.provider.KeySize >> 3);
this.iv = deriveBytes.GetBytes(16);
}
public SymmetricCryptography(string password, string salt, int iterations)
{
Rfc2898DeriveBytes deriveBytes = new Rfc2898DeriveBytes(password, this.utf8.GetBytes(salt), iterations);
this.key = deriveBytes.GetBytes(this.provider.KeySize >> 3);
this.iv = deriveBytes.GetBytes(16);
}
public byte[] Encrypt(byte[] input)
{
return this.Encrypt(input, this.key, this.iv);
}
public byte[] Encrypt(byte[] input, byte[] key, byte[] iv)
{
return this.Transform(
input,
this.provider.CreateEncryptor(key, iv));
}
public byte[] Decrypt(byte[] input)
{
return this.Decrypt(input, this.key, this.iv);
}
public byte[] Decrypt(byte[] input, byte[] key, byte[] iv)
{
return this.Transform(
input,
this.provider.CreateDecryptor(key, iv));
}
public string Encrypt(string text)
{
return this.Encrypt(text, this.key, this.iv);
}
public string Encrypt(string text, byte[] key, byte[] iv)
{
byte[] output = this.Transform(
this.utf8.GetBytes(text),
this.provider.CreateEncryptor(key, iv));
return Convert.ToBase64String(output);
}
public string Decrypt(string text)
{
return this.Decrypt(text, this.key, this.iv);
}
public string Decrypt(string text, byte[] key, byte[] iv)
{
byte[] output = this.Transform(
Convert.FromBase64String(text),
this.provider.CreateDecryptor(key, iv));
return this.utf8.GetString(output, 0, output.Length);
}
public void Encrypt(Stream input, Stream output)
{
this.Encrypt(input, output, this.key, this.iv);
}
public void Encrypt(Stream input, Stream output, byte[] key, byte[] iv)
{
this.TransformStream(true, ref input, ref output, key, iv);
}
public void Decrypt(Stream input, Stream output)
{
this.Decrypt(input, output, this.key, this.iv);
}
public void Decrypt(Stream input, Stream output, byte[] key, byte[] iv)
{
this.TransformStream(false, ref input, ref output, key, iv);
}
private byte[] Transform(
byte[] input,
ICryptoTransform cryptoTransform)
{
byte[] result;
using (MemoryStream memoryStream = new MemoryStream())
{
using (CryptoStream cryptStream = new CryptoStream(
memoryStream,
cryptoTransform,
CryptoStreamMode.Write))
{
cryptStream.Write(input, 0, input.Length);
cryptStream.FlushFinalBlock();
memoryStream.Position = 0;
result = memoryStream.ToArray();
}
}
return result;
}
private void TransformStream(bool encrypt, ref Stream input, ref Stream output, byte[] key, byte[] iv)
{
// defensive argument checking
if (input == null)
{
throw new ArgumentNullException("input");
}
if (output == null)
{
throw new ArgumentNullException("output");
}
if (!input.CanRead)
{
throw new ArgumentException("Unable to read from the input Stream.", "input");
}
if (!output.CanWrite)
{
throw new ArgumentException("Unable to write to the output Stream.", "output");
}
// make the buffer just large enough for
// the portion of the stream to be processed
byte[] inputBuffer = new byte[input.Length - input.Position];
// read the stream into the buffer
input.Read(inputBuffer, 0, inputBuffer.Length);
// transform the buffer
byte[] outputBuffer = encrypt ? Encrypt(inputBuffer, key, iv)
: Decrypt(inputBuffer, key, iv);
// write the transformed buffer to our output stream
output.Write(outputBuffer, 0, outputBuffer.Length);
}
}
最佳答案
文档有点欠缺,但我在 FAQ 中指出了这一点:
Can I share the types from PclContrib with my platform-specific projects? No, not currently. While the types in PclContrib look and feel like their platform-specific counterparts, the runtime and compiler will see them as completely different types. While we have some ideas on how to make this work, this is a feature that we won't be looking at for the short term.
关于c# - 可移植类库 (PCL) 贡献 - 密码学,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12688296/
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我看到github记录了每个贡献者的提交、添加和删除历史。您可以在图表选项卡上查看它。 然而,它并不像我想要的那么细。 是否可以在命令行上获取此信息? 我想以表格的形式保存更细粒度的数据集。 我在想的
我正在尝试将每位作者的每行贡献打印到 Git 存储库。 为此,我使用以下命令,改编自 How to count total lines changed by a specific author in
到目前为止,我只使用带有 gem 的 git 包: gem install 没有为更正 git-hub 做出贡献。 不知道你们是怎么做到的? 例如。当我安装了 gem 包后,我应该手动创建一个文件夹
所以我在github上克隆了一个项目并修复了一个补丁。因为这是我第一次在 git 中工作,所以我试图找出将它放到网上的最佳方式。 在 github 上查看我自己的(克隆的)存储库时,只有一个分支:ma
为什么,如果我提交,比方说,develop分支,这不是出现在我的贡献中吗? 我预计如果我将该分支 merge 到 master然后所有提交到 develop或其他分支将是可见的。但情况似乎并非如此。
虽然像 RUnit、svUnit 和 testthat 这样的工具对包开发人员很有用,但我认为拥有一些方法会很有用上传测试脚本,甚至只是特定包的使用示例。进行持续集成(例如 Jenkins)甚至基本单
我想在 Portable Class Library Contrib project on codeplex 中使用密码学但没有找到任何关于如何使用它的文档。 我想创建一个包含 Encrypt 和 D
我设置以下 http://django-grappelli.readthedocs.org/en/2.6.3/index.html settings.py INSTALLED_APPS = (
我已经为我的 e4 应用程序定义了一个全局命令,即 add 命令。所以,正如你所看到的 该命令将在整个应用程序 (1) 中使用,并用于在上下文切换到响应时激活的响应处理程序。 (2) 和 (3) 中的
fb-contrib 提示 Method throws alternative exception from catch block without history 在我的一个 try/catch b
我从来没有向开源项目提交过任何东西,坦率地说,我不在乎 Rails 的人们对这些方法的看法。我喜欢“last”和“first”方法,并希望将该概念扩展到“second”-“ninth”方法中,以便进行
我是一名优秀的程序员,十分优秀!