我看到了JCPABE项目,但是类中的方法使我能够加密文件或InputStream,但不能加密简单的Java字符串。如何使用这些方法加密/解密字符串?我试图在字节数组中转换字符串但它不起作用(即String.getBytes("UTF_8");
如果我转换String
中的InputStream
。我怎样才能加密/解密简单的字符串?
实施例: 我的简单代码:
String test="Message";
policy="newyork or losangeles";
Cpabe.encrypt(publickey, policy, test, test);
我有这样的消息:Cpabe类型中的方法encrypt(File,String,File,File)不适用于参数(File,String,String,String)。
功能加密是这样的:
public static void encrypt(File publicKeyFile, String policy, File inputFile, File outputFile) throws IOException, AbeEncryptionException {
AbePublicKey publicKey = AbePublicKey.readFromFile(publicKeyFile);
try (BufferedInputStream in = new BufferedInputStream(new FileInputStream(inputFile));
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(outputFile))) {
encrypt(publicKey, policy, in, out);
}
我更改了以下功能:
public static void encrypt(File publicKeyFile, String policy, String inputstr, String outputstr) throws IOException, AbeEncryptionException {
AbePublicKey publicKey = AbePublicKey.readFromFile(publicKeyFile);
try (String in = new String(inputstr);
String out = new String(outputstr)) {
encrypt(publicKey, policy, in, out);
}
}
但我有其他消息:资源类型String没有在String in和String out上实现java.lang.AutoCloseable;在加密时我有这些消息:Cpabe类型中的方法encrypt(AbePublicKey,String,InputStream,OutputStream)不适用于参数(AbePublicKey,String,String,String)。
这是具有2个InputStream参数的函数:
public static void encrypt(AbePublicKey publicKey, String policy, InputStream input, OutputStream output) throws AbeEncryptionException, IOException {
AbeEncrypted encrypted = encrypt(publicKey, policy, input);
encrypted.writeEncryptedData(output, publicKey);
}
这是writeEncryptedData方法:
public void writeEncryptedData(OutputStream out, AbePublicKey publicKey) throws IOException {
AbeOutputStream abeOut = new AbeOutputStream(out, publicKey);
Version.writeToStream(abeOut);
cipher.writeToStream(abeOut);
abeOut.writeInt(iv.length);
abeOut.write(iv);
byte[] buffer = new byte[1024];
int len;
while ((len = dataStream.read(buffer)) != -1) {
abeOut.write(buffer, 0, len);
}
}
答案 0 :(得分:2)
您的代码因各种原因而无法使用。首先,您需要一个InputStream和OutputStream。要使用String,您必须先将其转换为<div ng-controller="UserCtrl">
<form ng-submit="addUser(user)">
<input type="text" ng-model="user.username">
<input type="text" ng-model="user.level">
</form>
<ul>
<li ng-repeat="user in users">{{user.username}}</li>
</ul>
</div>
,然后再转换为流。
在您的函数中,您定义了类似“out参数”byte[]
的内容。但是,字符串在Java中是不可变的,因此您不能以这种方式使用它并更改它的内容。而是将其用作返回值。
第三,永远不会尝试使用String outputstr
将byte[]
转换为String
。这不会返回具有可打印字符的String,而是返回具有二进制不可打印内容的String。你必须对它进行编码,例如使用base64。在解密之前,您必须应用base64解码。
new String(<byte array>)