【问题标题】:Java encryption issue with data type conversion数据类型转换的 Java 加密问题
【发布时间】:2012-05-15 09:58:31
【问题描述】:

我已经实现了使用字符串在客户端和服务器之间进行通信的 Web 服务。我遇到的问题是将加密字节数组转换为字符串,因为我无法将其转换回服务器端的原始内容。

KeyPairGenerator keyGen;
keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(1024);
KeyPair key = keyGen.generateKeyPair();

String publicKeyPath = new String("publicKeys.txt");
publickey = key.getPublic()
byte[] pubEncoded = key.getPublic().getEncoded();
FileOutputStream fout = new FileOutputStream(publicKeyPath);
fout.write(pubEncoded);
fout.flush();
fout.close();

String privateKeyPath = new String("privateKeys.txt");
byte[] privEncoded = key.getPrivate().getEncoded();
fout = new FileOutputStream(privateKeyPath);
fout.write(privEncoded);
fout.flush();
fout.close();

cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");

在客户端的每个方法上:

cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, publickey); 
byte[] cipherText = cipher.doFinal(str.getBytes());
port.callX(chiperText.toString());

在服务器端:

cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] newPlainText = cipher.doFinal(arg.getBytes());

这给出了“数据必须以零开头”的填充问题

只生成了一个KeyPair,为了调试,我尝试在同一个函数上加密和解密,问题依赖于从byte[]到String的转换。

我真的不想将参数传递更改为其他类型,因为操作是自动生成的,并且所有代码都是字符串。我尝试过使用不同的“UTF-8”和“UTF-16Le”,但没有一个有效:S

有什么想法吗?

【问题讨论】:

  • 出于兴趣,你为什么到处调用 String(String) 构造函数?
  • 无特殊原因...您可以将其更改为 String path = "XX" 问题与文件路径无关。它很好地存储了密钥
  • 当然 - 这只是奇怪的代码,仅此而已。

标签: java type-conversion encryption-asymmetric


【解决方案1】:

直接使用非对称密钥加密数据不是一个好主意,而且它不起作用。 RSA 密钥不能加密大于其密钥长度的数据。因此,正确的做法是生成对称密钥并使用对称密钥加密数据,然后使用非对称密钥加密对称密钥。因此,您需要将加密数据和加密密钥同时发送给对方。

如果您尝试使用非对称密钥直接加密数据,那么您的 byte[] 可能不包含正确的数据,或者它可能根本不包含任何内容。如果您的数据大于密钥长度,则会发生这种情况。对于较小的密钥长度的数据,它可以正常工作,但不适用于较大的数据。

【讨论】:

  • 它需要使用非对称键,这是要求之一。问题是,我设法将它们从字节转换为字符串并恢复正常,但现在使用“ISO-8859-1”,问题是我无法通过网络服务传递它,因为它包含非法字符:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-25
  • 2015-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多