Encryption OpenSSL字符串解密问题

Encryption OpenSSL字符串解密问题,encryption,openssl,cryptography,Encryption,Openssl,Cryptography,我会尽量使这句话简洁 我希望能够使用OpenSSL对简单字符串进行加密和解密,这是我以前做过的 但是,必须满足以下条件: 简单密码短语使用(无密钥) 没有输入/输出文件 不提示输入密码短语(通过命令行选项指定任意方向) 我有50%的支持率。我可以通过以下方式成功执行加密: echo 'someTextIWantToEncrypt' | openssl enc -e -aes-256-cbc -nosalt -pass pass:mySecretPass 输出结果是: (??b}n??v??

我会尽量使这句话简洁

我希望能够使用OpenSSL对简单字符串进行加密和解密,这是我以前做过的

但是,必须满足以下条件:

  • 简单密码短语使用(无密钥)
  • 没有输入/输出文件
  • 不提示输入密码短语(通过命令行选项指定任意方向)
我有50%的支持率。我可以通过以下方式成功执行加密:

echo 'someTextIWantToEncrypt' | openssl enc -e -aes-256-cbc -nosalt -pass pass:mySecretPass
输出结果是:

(??b}n??v???>??G??.?B??~?
好的,太好了。现在我想解密这个字符串。因此,我:

echo -n '(??b}n??v???>??G??.?B??~?' | openssl enc -d -aes-256-cbc -pass pass:mySecretPass
或者甚至作为替代方案:

openssl enc -d -aes-256-cbc -pass pass:mySecretPass <<< '(??b}n??v???>??G??.?B??~?'
虽然我不想使用输入/输出文件,但该方法确实可以100%工作:

# encrypt to file
echo -n 'someTextIWantToEncrypt' | openssl enc -e -nosalt -out test.txt -aes-256-cbc -pass pass:mySecretPass 

# decrypt from file
openssl enc -d -nosalt -in test.txt -aes-256-cbc -pass pass:mySecretPass

# result of decryption (is successful):
someTextIWantToEncrypt
所以。。。如何在不使用输入/输出文件的情况下实现上述解密过程?我觉得我很接近,但遗漏了一些小细节


提前感谢。

问题是加密使用整个ASCII字符集,包括不可打印的字符。如果希望能够剪切和粘贴加密数据,则需要将其转换为仅可打印的字符。您可以使用
-base64
(或
-a
)选项执行此操作:

然后用同样的方法解密:

echo "KPkBkGJ9bs4YHvh24xz7m9jTlYWm1LcIFcWR0DwY4PU=" | \
  openssl enc -base64 -d -aes-256-cbc -nosalt -pass pass:mySecretPass
警告:如果您使用的是openssl,我只能假设数据的机密性,因此密码对您很重要。如果是这种情况,您应该永远不要在命令行上提供密码,,因为它可以向任何有权运行
ps
的人公开

更好的解决方案是将密码存储在环境变量中,并让openssl从中读取密码:

export passwd="mySecretPass"
echo "KPkBkGJ9bs4YHvh24xz7m9jTlYWm1LcIFcWR0DwY4PU=" | \
  openssl enc -base64 -d -aes-256-cbc -nosalt -pass env:passwd
解密


Decrypt的输出是$text如何修复它?

你是正确的,我已经发现了这一点——你和帮助我的人都是正确的。道具归你们两个。因为我对这个网站是如此陌生,所以在接下来的几个小时里,它不会让我回答我自己的问题。无论如何,谢谢你!另外,你对“更好”解决方案的看法也是正确的。我只能说,这是一个有效的概念证明,为了补充您的评论,最终目标是对此类信息进行更安全的“存储”,而不是将其暴露在命令行中。亚当·利斯,你真是太好了。既然如此,我恭敬地建议你征求一位安全专家的意见。在15年多的业务中,您看到了许多看似合理但极为脆弱的实现。我们完全同意——此外,如果这个POC成熟到可行的状态,它最终将由社区驱动。在像这样的短字符串上,您应该使用salt。否则,使用相同密钥的相同输入的加密输出将始终相同。因此,允许攻击者替换字符串,或仅识别已知字符串何时出现。请您确切解释问题是什么?如何修复什么?你希望程序做什么?我想加密字符串并保存在文本文件中programd做得很好,但当我选择decrypt时,我选择了文件路径(保存加密文本的地方),但输出是$text而不是decrypted Strings。你能将此添加到你的问题中吗?这样其他人就可以准确地理解问题所在。使用双引号而不是单引号:
echo-n“$text”| openssl…
或完全不使用引号:
echo$text | openssl…
echo "KPkBkGJ9bs4YHvh24xz7m9jTlYWm1LcIFcWR0DwY4PU=" | \
  openssl enc -base64 -d -aes-256-cbc -nosalt -pass pass:mySecretPass
export passwd="mySecretPass"
echo "KPkBkGJ9bs4YHvh24xz7m9jTlYWm1LcIFcWR0DwY4PU=" | \
  openssl enc -base64 -d -aes-256-cbc -nosalt -pass env:passwd
#!/bin/bash
clear 
# encrypt to file
echo "enter choice "
echo "1-dakr"
echo "2-gakr"
read choice 
case $choice in
1 )
echo "text?"
read text
echo "pass?"
read pass

echo -n '$text' | openssl enc -e -nosalt -out test.txt -aes-256-cbc -pass pass:$pass 
;;
2 ) 
# decrypt from file
echo "pass?"
read pass
echo "path?"
read path
openssl enc -d -nosalt -in $path -aes-256-cbc -pass pass:$pass
;;
* )
echo "shcd"
;;
esac