java与Python互通的rsa_在Python和Java之间插入RSA签名时出现问题/

我正在用Python2编写一个客户端,使用Python2加密API对一个XML文件进行数字签名,我有一个用Scala编写的服务来验证签名。我的Python代码如下所示:from Crypto.PublicKey import RSA

from Crypto.Hash import SHA

from os import urandom

import logging

...

...

要生成密钥(keysize为2048):

^{pr2}$

读钥匙的时候:self.__private_key = fpri.read()

self.__public_key = fpub.read()

self.__key = RSA.importKey(self.__private_key)

以及数字签名logging.debug('Data to sign: "%s"' % data)

digest = SHA.new(data.strip()).digest()

return str(self.__key.sign(digest, None)[0])

然后在Scala/Java中,我使用以下命令:package com.example.security

import com.example.action.ActionRequest

import java.io.BufferedInputStream

import java.security.spec.X509EncodedKeySpec

import java.security.KeyFactory

import java.security.PublicKey

import java.security.Signature

import org.apache.log4j.Logger

class SignatureSecurityManageer extends SecurityManagerTrait {

def loadPublicKey() : PublicKey = {

val stream : BufferedInputStream = new BufferedInputStream(this.getClass().getResourceAsStream("/com/example/security/key.der"))

var key = new Array[Byte](stream.available())

stream.read(key)

KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(key))

}

def securityFilter(req : ActionRequest) : Boolean = {

var parts = req.data.split("\n\n")

var log : Logger = Logger.getLogger(this.getClass());

log.trace("Data \"%s\"".format(parts(0)))

log.trace("Sig \"%s\"".format(parts(1)))

var sg = Signature.getInstance("SHA1withRSA");

sg.initVerify(loadPublicKey())

sg.update(parts(0).trim().getBytes())

sg.verify(parts(1).trim().getBytes())

}

}

我把客户端生成的PEM公钥转换成二进制公钥,这样Java就可以读取它了:openssl rsa -in src/com/example/security/key.pub -inform PEM -out src/com/example/security/key.der -outform DER -pubin

在传输过程中,我用两个新行分隔XML和签名。我意识到尾随空格可能会出现问题,所以我在上面添加了这些strip/trim,并检查日志并验证数据是否相同:

Python客户端:2012-04-09 14:24:51,089: Data to sign: "<?xml version="1.0" ?>82741.142"

Scala服务:[2012-04-09 14:24:51,771] com.urbanalta.agrastore.security.SignatureSecurityManageer TRACE - Data "<?xml version="1.0" ?>82741.142"

但是在Scala服务中,当我试图验证签名时,它返回false。我想在某个地方我没有指定正确的签名/密钥类型,但我不确定在哪里。在

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值