好吧,我可能只是一个糟糕的星期一,但我有以下需要,我看到很多部分解决方案,但我确定我不是第一个需要这个的人,所以我想知道我是否我错过了显而易见的事.
$ client有50到500字节的二进制数据,必须插入到URL的中间并往返客户的浏览器.由于它是URL的一部分,因此我们反对GET URL的1K"理论"限制.此外,$ client不希望他们的客户解码数据,或在没有检测的情况下篡改数据.$ client也不希望在服务器端存储任何东西,所以这必须是完全独立的.在编码和解码中必须是Perl代码,并且速度快.
我认为最后一步可能是base64.但是最有意义的加密和散列步骤是什么?
我正在编写一段代码来使用对称加密来加密文本.但它没有以正确的结果回归......
from Crypto.Cipher import AES
import os
crypto = AES.new(os.urandom(32), AES.MODE_CTR, counter = lambda : os.urandom(16))
encrypted = crypto.encrypt("aaaaaaaaaaaaaaaa")
print crypto.decrypt(encrypted)
Run Code Online (Sandbox Code Playgroud)
这里,解密的文本与原始文本不同.
我对密码学的了解并不多,所以请耐心等待.我理解CTR模式需要一个"计数器"功能来每次提供一个随机计数器,但为什么当我的密钥是32字节时它需要它是16个字节并且它坚持我的消息也是16字节的倍数?这是正常的吗?
我猜它没有回到原始消息,因为计数器在加密和解密之间发生了变化.但那么,它究竟应该在理论上如何运作呢?我究竟做错了什么?无论如何,我被迫回到欧洲央行,直到我弄明白:(
我正在尝试在Android上加密Java中的字符串,然后使用PHP和/或node.js对其进行解密
我已经尝试了http://www.androidsnippets.com/encrypt-decrypt-between-android-and-php,但只返回返回的十六进制字符串的前半部分.
我希望加密类型是带有128位密钥的AES(如果可能的话,更高).
加密密钥也需要是可配置的,所以我的问题可能与我填充字符串的方式有关.
Java的
String.format("%1$-" + n + "s", s)
Run Code Online (Sandbox Code Playgroud)
PHP
$key = str_pad($key,16);
Run Code Online (Sandbox Code Playgroud)
完整的Java代码:
package com.giggsey.test;
import java.security.NoSuchAlgorithmException;
import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import android.util.Log;
public class SimpleCrypto {
private String iv = "fedcba9876543210";//Dummy iv (CHANGE IT!)
private IvParameterSpec ivspec;
private SecretKeySpec keyspec;
private Cipher cipher;
private String SecretKey = "0123456789abcdef";//Dummy secretKey (CHANGE IT!)
public void doKey(String key)
{
ivspec = new IvParameterSpec(iv.getBytes());
key = padRight(key,16);
Log.d("hi",key);
keyspec = new SecretKeySpec(key.getBytes(), "AES");
try …Run Code Online (Sandbox Code Playgroud) 我正在寻找比ROT13更复杂的东西,但它不需要一个库(甚至不是一个单元,只是功能下降).
我想用用户提供的密码对称地加密/解密给定的字符串.但是,结果必须是一个字符串,在某种意义上我必须能够将它存储在.INI文件中.
有没有人有这么简单的功能(delphi XE2)?谷歌今天不是我的朋友.
提前致谢
[更新]/[赏金]只是为了说清楚(如果它不是最初的aplogies),我不想要哈希.我有一个列表框,用户可以在其中添加/修改/删除条目.我希望在程序关闭时将它们存储在.INI文件中,并在它再次启动时重新加载.任何查看.INI文件的人(例如,在记事本中打开它)都不应该读取这些字符串.
我想我可以将组件流式传输为二进制文件,但为了减轻思想,我宁愿使用用户提供的密码加密字符串.出于此应用程序的目的,.INI文件节名称或键值是否是人类可读的并不重要,我只想加密数据,在存储到磁盘时给我一些列表:
[config]
numEntries=3
[listbox]
0=ywevdyuvewfcyuw
1=edw
2=hr4uifareiuf
Run Code Online (Sandbox Code Playgroud) 加密SQL数据库中的某些敏感或个人身份识别数据(根据PCI,HIPAA或其他适用的合规标准)的"最佳实践"是什么?
这里有很多关于解决方案的个别方面的问题,但我没有看到任何在高层次上讨论该方法的问题.环顾了一段时间后,我想出了以下内容:
这够了吗?过时了吗?审计,安全吗?鲁莽?
我正在使用Rijndael来加密程序中的一些敏感数据.
当用户输入错误的密码时,大多数时候CryptographicException会抛出一条消息"填充无效且无法删除".
但是,如果概率非常小,CryptStream不会使用错误的密码抛出异常,而是会返回错误解密的流.换句话说,它解密为垃圾.
知道如何检测/防止这种情况吗?我能想到的最简单的方法是在加密时在消息的开头添加一个"幻数",并在解密后检查它是否仍在那里.
但如果有更简单的方法,我很乐意听到它!
这就是我们拥有的场景:我们有大量的加密文件,大约为千兆字节,如果我们读到它们,我们可以正确解密.当我们读取并检测文件中的某个标志时会出现问题,然后我们停止读取并调用reader.Close(),会发生CryptographicException:"Padding无效且无法删除".被扔了.我有这个小控制台应用程序重现这种行为,测试它只是运行它,它将在你的C:\驱动器中创建一个文件然后按任意键时将逐行读取,并在按'q'时停止.
using System;
using System.IO;
using System.Security.Cryptography;
namespace encryptSample
{
class Program
{
static void Main(string[] args)
{
var transform = CreateCryptoTransform(true);
// first create encrypted file
using (FileStream destination = new FileStream("c:\\test_enc.txt", FileMode.OpenOrCreate, FileAccess.Write, FileShare.ReadWrite))
{
using (CryptoStream cryptoStream = new CryptoStream(destination, transform, CryptoStreamMode.Write))
{
using (StreamWriter source = new StreamWriter(cryptoStream))
{
for (int i = 0; i < 1000; i++)
{
source.WriteLine("This is just random text to fill the file and show what happens when I stop reading …Run Code Online (Sandbox Code Playgroud) 在我阅读了有关密码学(对称和非对称)方法的文章之后.很多文章都说私钥用于加密和解密数据.公钥用于加密数据.但是当我尝试用Java开始实现时我不能能够使用私钥来加密和解密数据(我正在使用RSA算法)?如果有可能请给我一个链接.如果它不支持,请回答为什么它不支持?
//加密
Cipher encrypt=Cipher.getInstance("RSA");
encrypt.init(Cipher.ENCRYPT_MODE, privatekey);
byte[] encryptedMessage=encrypt.doFinal(msg.getBytes());
Run Code Online (Sandbox Code Playgroud)
//解密
Cipher decrypt=Cipher.getInstance("RSA");
decrypt.init(Cipher.DECRYPT_MODE, privateKey);
byte[] decryptedMessage=decrypt.doFinal(encryptedMessage);
Run Code Online (Sandbox Code Playgroud) java cryptography encryption-asymmetric encryption-symmetric
所以我试图使用DPAPI存储对称密钥.一切都很好,但是如何处理熵呢?这个回答的问题在这里真的没有提供足够的洞察力.这似乎是一个滑坡 - 我可以使用机器商店来存储熵,但是那么是什么阻止了某人也可以使用它?注意:我使用用户范围存储当前密钥.
所以我的问题是 - 使用DPAPI存储熵的最佳方法是什么?
我已经编写了一个由网上几种方法构建的加密例程.我正在测试加密,并注意到每个加密值以"=="结尾?
有谁知道为什么会这样?
这是我正在使用的代码.键是32个char值,IV是16个char值.
private static readonly byte[] key = Encoding.Default.GetBytes(getKey());
private static readonly byte[] iv = Encoding.Default.GetBytes("$ruVe4E!eM#kupuc");
/// <summary>
///
/// </summary>
/// <param name="val"></param>
/// <returns></returns>
public static string Encrypt(string val)
{
string result = string.Empty;
var aes = getEncryptionType();
using (MemoryStream msEncrypt = new MemoryStream())
{
using (ICryptoTransform encryptor = aes.CreateEncryptor(key, iv))
{
using(CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
{
using(StreamWriter swEncrypt = new StreamWriter(csEncrypt))
{
swEncrypt.Write(val);
}
}
}
result = Convert.ToBase64String(msEncrypt.ToArray());
}
aes.Clear();
return result; …Run Code Online (Sandbox Code Playgroud)