JAVA RSA无填充加密求助,通过模和指数进行加密

ZJJ846859163 2021-04-04 10:16:06
现有需求通过模和指数 对 参数message进行RSA加密。
目前掌握Python代码:
import rsa
#模
m = "ae068c2039bd2d82a529883f273cf20a48e0b6faa564e740402375a9cb332a029b8492ae342893d9c9d53d94d3ab8ae95de9607c2e03dd46cebe211532810b73cc764995ee61ef435437bcddb3f4a52fca66246dbdf2566dd85fbc4930c548e7033c2bcc825b038e8dd4b3553690e0c438bbd5ade6f5a476b1cbc1612f5d501f"
#指数
e = '010001'
#加密参数
message = '123456'

class Encrypt(object):
def __init__(self, e, m):
self.e = e
self.m = m

def encrypt(self, message):
mm = int(self.m, 16)
ee = int(self.e, 16)
rsa_pubkey = rsa.PublicKey(mm, ee)
crypto = self._encrypt(message.encode(), rsa_pubkey)
return crypto.hex()

def _pad_for_encryption(self, message, target_length):
message = message[::-1]
max_msglength = target_length - 11
msglength = len(message)

padding = b''
padding_length = target_length - msglength - 3

for i in range(padding_length):
padding += b'\x00'

return b''.join([b'\x00\x00', padding, b'\x00', message])

def _encrypt(self, message, pub_key):
keylength = rsa.common.byte_size(pub_key.n)
padded = self._pad_for_encryption(message, keylength)

payload = rsa.transform.bytes2int(padded)
encrypted = rsa.core.encrypt_int(payload, pub_key.e, pub_key.n)
block = rsa.transform.int2bytes(encrypted, keylength)

return block

if __name__ == '__main__':
en = Encrypt(e, m)
print(en.encrypt(message))

输出: 2ab11a1d49a4d0ba2a7cc67135219be2444229fff08eb3f869200a545833f55bd00e25dc96b5126c9649b08f953ecc0e9a2d0d9650421061cafb1e52a4b8bdbb336e662eddabd1158b16f7c5a14d29c9009e506bbdccd2af0bf94061642423173f01765bf494d6a139872b4b10535559acd2eaed3cfc8c1858764e99716bc19b
结果是唯一确定。
最近在网上查阅资料后发现网上的JAVA RSA相关实现无法满足上述需求,在此求一JAVA的RSA加密算法能够满足上述需求。
给定 模 和 指数 以及message能够得到唯一加密字符串。
...全文
330 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ZJJ846859163 2021-04-07
  • 打赏
  • 举报
回复
引用 1 楼 冰思雨 的回复:
输出: 85f98cd5554260e631aed936ff8107f13ae683609a1ad1e48c9053580b141faf934d5238e333d680f5edd353f524d5a12a305ca31b42a878e8b913b7421a9d05e02d41848d1e516251c2d9dd497061e013f95339fda596ceb921a6a0d4b3a6c58cf81077429003927c31cf3b8cc14dbbc803e504c9f9ea5cc4f76ae4609f7dac 代码:
import org.apache.commons.lang3.StringUtils;

import javax.crypto.Cipher;
import java.math.BigInteger;
import java.security.KeyFactory;
import java.security.PublicKey;
import java.security.spec.RSAPublicKeySpec;

public class Encrypt {

    public static final String bytesToHexString(byte[] bArray) {
        StringBuffer sb = new StringBuffer(bArray.length);
        String sTemp;
        for (int i = 0; i < bArray.length; i++) {
            sTemp = Integer.toHexString(0xFF & bArray[i]);
            if (sTemp.length() < 2)
                sb.append(0);
            sb.append(sTemp.toLowerCase());
        }
        return sb.toString();
    }

    public static void main(String[] args) throws Exception {
        String m = "ae068c2039bd2d82a529883f273cf20a48e0b6faa564e740402375a9cb332a029b8492ae342893d9c9d53d94d3ab8ae95de9607c2e03dd46cebe211532810b73cc764995ee61ef435437bcddb3f4a52fca66246dbdf2566dd85fbc4930c548e7033c2bcc825b038e8dd4b3553690e0c438bbd5ade6f5a476b1cbc1612f5d501f";
        String e = "010001";
        String message = "123456";
        BigInteger modulus = new BigInteger(m, 16);
        BigInteger publicExponent = new BigInteger(e, 16);
        RSAPublicKeySpec keySpec = new RSAPublicKeySpec(modulus, publicExponent);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");

        PublicKey publicKey = keyFactory.generatePublic(keySpec);
        Cipher cipher = Cipher.getInstance("RSA/ECB/NoPadding");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] crypto = cipher.doFinal(message.getBytes());
        System.out.println(bytesToHexString(crypto));
    }

}
麻烦看看2楼的阐述,谢谢.
ZJJ846859163 2021-04-07
  • 打赏
  • 举报
回复
你好,感谢百忙直接抽出时间答复此贴。 想问一下为什么无法得到同样的加密效果了,理论上来说同样是RSA,相同的模和指数,相同的被加密字符串,出来的结果应该是一样的才对。 我手里面还有一份 security.js 是通过js实现的RSA加密,加密出来的效果和我发的这个python代码结果是一样的。 想问一下能不能通过Java实现加密出来效果是: 2ab11a1d49a4d0ba2a7cc67135219be2444229fff08eb3f869200a545833f55bd00e25dc96b5126c9649b08f953ecc0e9a2d0d9650421061cafb1e52a4b8bdbb336e662eddabd1158b16f7c5a14d29c9009e506bbdccd2af0bf94061642423173f01765bf494d6a139872b4b10535559acd2eaed3cfc8c1858764e99716bc19b的加密算法。 即和python和js保持加密结果一致性。
ZJJ846859163 2021-04-07
  • 打赏
  • 举报
回复
好的 谢谢你!
冰思雨 2021-04-07
  • 打赏
  • 举报
回复
我对加密算法不太了解,只是勉强会用而已。 上面的Java代码,就是 无填充 情况下的加密程序。 要想实现楼主的那种结果,我感觉是要自定义Cipher来实现了。 另外,一般情况下,填充方式,我们都会选择使用随机数进行填充的方式,而不是用0进行填充,否则,相对比较容易被破解。
冰思雨 2021-04-06
  • 打赏
  • 举报
回复
输出: 85f98cd5554260e631aed936ff8107f13ae683609a1ad1e48c9053580b141faf934d5238e333d680f5edd353f524d5a12a305ca31b42a878e8b913b7421a9d05e02d41848d1e516251c2d9dd497061e013f95339fda596ceb921a6a0d4b3a6c58cf81077429003927c31cf3b8cc14dbbc803e504c9f9ea5cc4f76ae4609f7dac 代码:
import org.apache.commons.lang3.StringUtils;

import javax.crypto.Cipher;
import java.math.BigInteger;
import java.security.KeyFactory;
import java.security.PublicKey;
import java.security.spec.RSAPublicKeySpec;

public class Encrypt {

    public static final String bytesToHexString(byte[] bArray) {
        StringBuffer sb = new StringBuffer(bArray.length);
        String sTemp;
        for (int i = 0; i < bArray.length; i++) {
            sTemp = Integer.toHexString(0xFF & bArray[i]);
            if (sTemp.length() < 2)
                sb.append(0);
            sb.append(sTemp.toLowerCase());
        }
        return sb.toString();
    }

    public static void main(String[] args) throws Exception {
        String m = "ae068c2039bd2d82a529883f273cf20a48e0b6faa564e740402375a9cb332a029b8492ae342893d9c9d53d94d3ab8ae95de9607c2e03dd46cebe211532810b73cc764995ee61ef435437bcddb3f4a52fca66246dbdf2566dd85fbc4930c548e7033c2bcc825b038e8dd4b3553690e0c438bbd5ade6f5a476b1cbc1612f5d501f";
        String e = "010001";
        String message = "123456";
        BigInteger modulus = new BigInteger(m, 16);
        BigInteger publicExponent = new BigInteger(e, 16);
        RSAPublicKeySpec keySpec = new RSAPublicKeySpec(modulus, publicExponent);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");

        PublicKey publicKey = keyFactory.generatePublic(keySpec);
        Cipher cipher = Cipher.getInstance("RSA/ECB/NoPadding");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] crypto = cipher.doFinal(message.getBytes());
        System.out.println(bytesToHexString(crypto));
    }

}

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧