我正在创建一个随机密钥,然后我想使用一种好的算法对其进行加密,然后再使用此加密密钥对数据进行加密。我的代码是:
$iv=16; //128bits
$datakey = base64_encode(openssl_random_pseudo_bytes($iv,$strong));
$datakey = md5($datakey);
$finaldata= mcrypt_encrypt(MCRYPT_BLOWFISH, $datakey, $stringtobeencoded, MCRYPT_MODE_CFB);
错误:
加密模式需要大小为8的初始化向量
如何满足我的要求?
答案 0 :(得分:11)
我想使用一种好的算法对其进行加密
您问题中包含的代码段不安全。我强烈建议:
但是您得到的错误是Blowfish-CFB需要一个密钥和一个IV,而您只提供了一个密钥。
答案 1 :(得分:6)
实际错误- Encryption mode requires an initialization vector of size 8
-不是无效的密钥大小,而是缺少IV。
CFB mode需要IV(初始化向量)。 IV大小通常与块大小相同,Blowfish为64位,AES为128位。
通常最好不要使用Blowfish进行加密,即使最近它的作者也使用AES。
在保存密码验证程序时,仅使用哈希函数是不够的,仅添加盐就无法提高安全性。取而代之的是,使用随机盐在HMAC上迭代大约100毫秒的持续时间,并将盐与哈希一起保存。最好还是使用诸如PBKDF2
,Rfc2898DeriveBytes
,Argon2
,password_hash
,Bcrypt
之类的功能或类似功能。通过PHP使用password_hash
和password_verify
,该对是安全且易于使用的。
关键是使攻击者花费大量时间通过蛮力查找密码。
最好不要使用PHP mcrypt,它是废弃软件,已经多年没有更新,并且不支持标准PKCS#7(néePKCS#5)填充,仅支持甚至不能使用的非标准null填充与二进制数据一起使用。 mcrypt具有许多可追溯到2003年的出色bugs。不建议使用mcrypt-extension,在PHP 7.2中已将其删除。与其考虑使用defuse或RNCryptor,它们提供了一个完整的解决方案,并且正在维护且正确。
答案 2 :(得分:1)
您的示例中有很多内容,因为不推荐使用package cacheprocess;
import java.util.ArrayList;
import java.util.Scanner;
public class CacheProcess {
public static Color[][] mainMemory;
public static ArrayList<String> Cache = new ArrayList<>();
public static void main(String[] args) {
}
public static void init(){
int N,M,K;
float mRate, hRate;
Scanner s = new Scanner(System.in);
int algorithmNum;
do {
System.out.println("Enter N");
N = s.nextInt();
System.out.println("Enter M");
M = s.nextInt();
} while (!(((M*N)%2) == 0));
do {
System.out.println("Enter number of K blocks :");
K = s.nextInt();
} while (!((K%2) == 0) && K > (N * M / 4));
do {
System.out.println("Choose algorithm:");
algorithmNum = s.nextInt();
int [] h;
switch(algorithmNum) {
case 1:
h=Algorithm1(N,M,K);
break;
//case 2:
// h=Algorithm2(N,M,K);
// break;
// case 3:
// h=Algorithm3(N,M,K);
// System.out.println("Y Total: " + h[3]);
// System.out.println("Y Miss: " + h[4]);
//break;
default:
h=Algorithm1(N,M,K);
break;
}
mRate=(float)h[1]/(float)h[0];
hRate=(float)h[2]/(float)h[0];
System.out.println("Total access: " + h[0]);
System.out.println("Miss: " + h[1]);
System.out.println("Hit: " + h[2]);
System.out.println("Miss Rate: " + mRate);
System.out.println("Hit Rate: " + hRate +"\n\n");
}while(true);
}
public static int [] Algorithm1(int N,int M, int K){
int[] result = new int[3];
mainMemory = new Color[N][M];
int miss = 0, totalAccess = 0, cellsFilled = 0;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
mainMemory[i][j] = new Color();
mainMemory[i][j].c = 0;
mainMemory[i][j].m = 0;
mainMemory[i][j].y = 1;
mainMemory[i][j].k = 0;
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
Cache.add( String.valueOf(i) + String.valueOf(j)+ mainMemory[i][j].c);
cellsFilled++;
if(cellsFilled == K){
Cache.clear();
}
if(!cacheCheck(i,j,mainMemory[i][j].y, Cache)){
miss++;
totalAccess++;
}
Cache.add(String.valueOf(i)+String.valueOf(j)+mainMemory[i][j].m);
cellsFilled++;
if(cellsFilled == K){
Cache.clear();
}
if(!cacheCheck(i,j,mainMemory[i][j].y, Cache)){
miss++;
totalAccess++;
}
Cache.add((String.valueOf(i)+String.valueOf(j)+mainMemory[i][j].y));
cellsFilled++;
if(cellsFilled == K){
Cache.clear();
}
if(!cacheCheck(i,j,mainMemory[i][j].y, Cache)){
miss++;
totalAccess++;
}
Cache.add((String.valueOf(i)+String.valueOf(j)+mainMemory[i][j].k));
cellsFilled++;
if(cellsFilled == K){
Cache.clear();
}
if(!cacheCheck(i,j,mainMemory[i][j].y, Cache)){
miss++;
totalAccess++;
}
}
}
result[0]=totalAccess;
result[1]=miss;
result[2]=totalAccess-miss;
return result;
}
public static boolean cacheCheck(int i, int j, int color, ArrayList<String>
cache){
boolean Check = false;
if(cache.size() >= 3) {
String firstElement = cache.get(cache.size()-3);
secondElement = cache.get(cache.size()-2);
String thirdElement = cache.get(cache.size()-1);
if(firstElement.equals(String.valueOf(i)) &&
secondElement.equals(String.valueOf(j))){
if(thirdElement.equals(String.valueOf(mainMemory[i][j].c)) ||
thirdElement.equals(String.valueOf(mainMemory[i][j].m)) ||
thirdElement.equals(String.valueOf(mainMemory[i][j].y)) ||
thirdElement.equals(String.valueOf(mainMemory[i][j].k)))
Check = true;
}
}
return Check;
}
,所以本示例使用mcrypt_*
函数。要跳过IV创建(安全性较低但更容易),请使用以下命令:
openssl_*
对于更完整的实现,包括您在原始问题中尝试生成的$plainText = 'Hello world';
$key = 'my-secret-encrpytion-key';
$algo = 'BF-CFB'; // blowfish cfb
$cypherText = openssl_encrypt($plainText, $algo, $key);
echo base64_encode($cypherText); // ZTVtdWNMRUp5N1dwZ2NFPQ==
echo openssl_decrypt($cypherText, $algo, $key);
,以下代码将起作用:
$iv
已对其进行编辑以更正不正确的变量名。