- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
几天前,我提出了一个有关 Jasypt 问题的问题。我引用了一个抛出 EncryptionOperationNotPossibleException 的较大程序。嗯,我还是没能弄清楚问题所在。这是正在发生的事情:(这提供了对其工作原理的深入了解:)
Step 1: Connection
Client Connects
Server Callback: connection(Selection key)
Server Sends Cipher
Client Receives Cipher
Sends encrypted "connection" message "YYPgDOGffgxu6aahZyNSgw=="
Client Receives Encrypted msg "YYPgDOGffgxu6aahZyNSgw=="
Client Throws EncryptionOperationNotPossibleExcepton
at line 45
这真是紫星啊。字符编码可能有问题,但我不确定。服务器和客户端目前在同一台计算机上运行,我很确定我自始至终都在使用 US-ASCII。相关代码如下:
这是客户端:
public static String CHAR_ENC_B = "US-ASCII";
public static String cipher = null;
public static void main(String[] argv) throws UnknownHostException {
final BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
AbstractBlockingClient client = new AbstractBlockingClient(InetAddress.getByName("127.0.0.1"),4444) {
@Override
protected void messageReceived(ByteBuffer message) {
if (cipher==null) {
cipher=bb2str(message);
textEncryptor.setPassword(cipher);
System.out.println("Cipher(20):"+cipher);}
else {
System.out.println("Raw Message(22):"+bb2str(message));
System.out.println("Decrypted(23):"+textEncryptor.decrypt(bb2str(message)));
String tosend = textEncryptor.encrypt("Test Reply");
try {
this.write(textEncryptor.encrypt("Test Reply").getBytes(CHAR_ENC_B));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
@Override
protected void disconnected() {
}
@Override
protected void connected(boolean alreadyConnected) {
}
};
client.run();
}
这是服务器:
public static String CHAR_ENC_B = "US-ASCII";
public static void main(String[] argv) {
//Create the server:
AbstractServer server = new AbstractServer(4444) {
@Override
protected void messageReceived(ByteBuffer message, SelectionKey key) {
System.out.println("Recieved Raw Message(18):"+bb2str(message));
System.out.println("Recieved Decrypted Message(19):"+decrypt_string(getCS(key).ekey,bb2str(message)));
ClientSelector replacement = process_message(decrypt_string(getCS(key).ekey,bb2str(message)),getCS(key));
key.attach(replacement);
}
@Override
protected void connection(SelectionKey key) {
ClientSelector newone = new ClientSelector(key,"","","");
newone.ip = ((SocketChannel)key.channel()).socket().getRemoteSocketAddress().toString();
key.attach(newone);
this.write(key,newone.ekey.getBytes());
String tosend = encrypt_string(newone.ekey,"a");
this.write(key,tosend.getBytes());
System.out.println("Cipher:"+newone.ekey);
System.out.println("Encrypted String Sent(34):"+tosend);
}
@Override
protected void disconnected(SelectionKey key) {
}
@Override
protected void started(boolean alreadyStarted) {
System.out.println("SERVER STARTED");
}
@Override
protected void stopped() {
}
};
server.run();
}
public static String decrypt_string(String key, String msg) {
BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
textEncryptor.setPassword(key);
return textEncryptor.decrypt(msg);
}
public static String encrypt_string(String key, String msg) {
BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
textEncryptor.setPassword(key);
return textEncryptor.encrypt(msg);
}
这些实际上并不是要发送的消息,但这是一个很好的起点。
一些信息:ClientSelector
是一个类,允许服务器识别正在与谁通信(使用用户名、密码、IP 等),并且 bb2str
将 ByteBuffer
转换为 String
。
任何帮助将不胜感激。我希望这不是像上一个那样的愚蠢错误!谢谢。
编辑:我添加了 bb2str 的代码:
public static String bb2str(ByteBuffer bytebuff) {
byte[] bytearr = new byte[bytebuff.remaining()];
bytebuff.get(bytearr);
String s = null;
try {s = new String(bytearr,"US-ASCII");}
catch (UnsupportedEncodingException e) {e.printStackTrace();}
return s;
}
最佳答案
我明白了:
事情是这样的... bb2str()
的实现我这里写的好像清空了bytebuffer。所以我只能调用bb2str
一次。如果我多次调用它,那么我最终会得到一个空字符串,这会搞砸 jayspt,因为在代码中:
if (this.saltGenerator.includePlainSaltInEncryptionResults()) {
// Check that the received message is bigger than the salt
if (encryptedMessage.length <= this.saltSizeBytes) {
throw new EncryptionOperationNotPossibleException();
}
}
当然还有encryptedMessage.length
将是 <= this.saltSizeBytes
如果encryptedMessage.length
为零且 this.saltSizeBytes
是 8。
已修复。 war 结束了。
关于java - Jasypt EncryptionOperationNotPossibleException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16989041/
几天前,我提出了一个有关 Jasypt 问题的问题。我引用了一个抛出 EncryptionOperationNotPossibleException 的较大程序。嗯,我还是没能弄清楚问题所在。这是正在
我在我的 Spring Boot 应用程序中使用 Jasypt 和 BouncycaSTLe。我可以正常运行我的应用程序,并且加密的内容会添加到数据库中。 但是,在运行单元测试时,我得到: org.j
我正在使用 Jasypt API(版本 1.9.2)进行加密和解密。在使用命令行界面工具列出算法时,我得到以下列表。 listAlgorithms.bat PBE ALGORITHMS: [
我将 Jasypt-1.9.0 与 Spring 3.1 和 Hibernate 4.0.1 一起使用。我的应用程序需要连接到数据库,其密码(root)以加密形式存储在应用程序的属性文件中。 我上网查
我尝试在我的 Jasypt 中使用 3DES,但遇到异常。 但是当我使用默认算法时它工作正常 这是代码 - public MyEncryptablePropertyResolver(Environme
我尝试检查我之前加密过的密码,但出现异常,我不知道为什么。 这是我用来加密密码的方法: @Service("XEncryptor") public class XEncryptor { pri
我尝试使用 Jasypt与 Bouncy Castle crypro 在 Spring 应用程序中提供(128 位 AES)来解密实体属性,同时使用 Hibernate 保存它们。但是当尝试保存实体时
我正在使用 Jasypt 加密库来加密/解密一些文本。此代码嵌入到 WAR 文件中并部署到服务器。 在本地运行时,在单元测试中,加密/解密循环工作得很好。我使用 Jetty 来开发应用程序。该代码在该
我已经在我的网络应用程序的服务器代码中一次又一次地使用了此代码或类似的代码,但现在我正在尝试创建一个命令行实用程序来与维护后端一起使用。 继续收到EncryptionOperationNotPossi
我真的很难解决这个错误:有人可以帮助我吗? 我使用了 jasypt 标准...请帮助。用过这个:http://www.jasypt.org/ ENC : 0Ex+dkccYbqFQOmNrg93pok
我是一名优秀的程序员,十分优秀!