Buenas estimados
Retomando el tema, no logro obtener el resultado pedido :( en 茅stos pasos:
6. Tomar la secci贸n de la firma y obtener un HASH del mismo aplicando el algoritmo SHA256.
7. Encriptar el HASH obtenido utilizando el algoritmo RSA SHA256 con la llave privada.
8. Aplicar a la cadena resultante el algoritmo Base64 para obtener una cadena.
9. Adicionar a la etiqueta de Signature Value la cadena anterior.
He encontrado 茅ste c贸digo que es lo que mas se acerca a lo pedido.
#include "FiveWin.ch"
#include "hbssl.ch"
Function Main()
聽LOCAL ctx,cPrivateKey:= cSignXml:= encrypted:=""
#pragma __cstream|cPrivateKey:=%s
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCuC5IblBnw55fc
3KdSHXmPFP1Id/QXznhCaX4bPMOQBZXdu7WvOlT0cEbfhFiJZVFozvTfZYDOlfCm
MtJY6+kKihJTtQopp5cnzllJW1xtcvHWdGI+8J1fCll6wLK718tMBIQISktS/Z/X
i17mlX7jDslSV+/sKDyGvxHSQwKwbCKvpM9c5pcsV7tsYjP/BcZ/DhaHcy4Pf30n
CSKM+dmjdou+dIE6sFiB2lgVAMC+kQo7R+QN5ZKjGDaS+30f//TjNNJOUPR+tKe+
GPLgqgKivvMDJuOWvuY6KzRJyQAh3erykX/DFXTEcMTN6zUy4eP4A2PanmRFiH5M
VAlgZAHtAgMBAAECggEAF3Qgts2w5zlWSiGD/LlTGbhy31Km1pRwuUZdA4+fLOfL
x8sVUy0xqJT+v/0mLzGzlEObVQVpI62p9cOQfAIib9SmXphda7qVUHxqpMuGe4tL
UqJxYNjs5BNRdozEKTMNxssu/a0BVIgwA4xY+Aq6RB/Iemu2PaU4btINtT9pe9uF
tMYPlsoGtxq7Z7ulxc2szBe66PGuzd7ojKUf8XyjunhEcjuU9z+6//rl6EV4VkgF
Rk1uT6Uyj5vsYsNu7noNyjAp7nhuS4fm1/hJfxR3iRSTIJtUtP7kS5vQk2VipWdO
SnKmPciXVaNVe+S44ZGWYoKBPap77PVUiajXc5t/kQKBgQDXA3YQRGUl5+kPCllQ
l9psavX/4dlLnOWRdIuTeutPRcjlpyEdoeUCVs+ZZtroeriGr6cwFXni0FPCASm9
JNFx8zvg1VjVjXLsLi6+0kvEEd9xVMyQN4Ixap554EjeT1/vxMsdO3moAvS1xyBp
VpAgwdqht3IV5QTFF2X/b40xmQKBgQDPOODkFnG3f9fPOfzJNuv38wElIqnZaqcR
lPZF9jKfjWfhEMJju3FWui73sW1LgrkXFKTftbTb3/i0b/ez9EER7Inu+crG+2WF
XCPYY1wJvEczureRd69Xjx9iICoGSmJk7lpQuBR4S4umdpqnu/TF60YsTEF+PIi5
TvpxLhNvdQKBgQClJhFvGTmfzetjFA3aK2kn0Vg2PKEMxOxHtv7mPomzD+TpEGAN
RKaED23RZAFMg8ZsHUsLUdOW9XEAGKiYkUkWfz9EyFo9XTIiWq6o/xoW9atsfzfI
pfooPr6O2kjeCJWlssBYKbCd7fdMEDDC+CwoHP3zLNZCHvB0+i3r7yDCMQKBgC3q
A2JmWrH24KFozsrioWwh6roIsSucRwJNSDf+Mf9KPJ8QsJGagaVewXNeW8IkZ9Bm
YZWz1Cv3t0p7mJ3F2/kVuQY7UKPAJiFjZgnXEhiSIBClKXFQ3IgBDUoXqFgWeTC1
40sJTnfM/VdX5jKOIdEMrVK5XrWSwhSVHEahl+rVAoGBAIyoP8k6Z8T4pvWjkfCx
GluOFui7HRSW1SrHdZTSI5vfqx8Sj5bcCxVlsw67YcYkWot7t505HHtr/O2a6E2Q
RQEleHzBzbNS+GHDzR46/fa1YgDCRBDT5GzV/0mbOIQOv6zNwBaM8JvlJakYbjpe
wTTPUjAZesdQLrx4AhvTAD9D
-----END PRIVATE KEY-----
#pragma __endtext
*
#pragma __cstream|cSignXml:=%s
聽 聽 <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
聽 聽 聽 聽 <SignedInfo>
聽 聽 聽 聽 聽 聽 <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"></CanonicalizationMethod>
聽 聽 聽 聽 聽 聽 <SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"></SignatureMethod>
聽 聽 聽 聽 聽 聽 <Reference URI="">
聽 聽 聽 聽 聽 聽 聽 聽 <Transforms>
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"></Transform>
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 <Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"></Transform>
聽 聽 聽 聽 聽 聽 聽 聽 </Transforms>
聽 聽 聽 聽 聽 聽 聽 聽 <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"></DigestMethod>
聽 聽 聽 聽 聽 聽 聽 聽 <DigestValue>D4SjxwIFg+bOkVaVXo3K+e0C4bfTYrhXHfojtnvjLuo=</DigestValue>
聽 聽 聽 聽 聽 聽 </Reference>
聽 聽 聽 聽 </SignedInfo>
聽 聽 聽 聽 <SignatureValue></SignatureValue>
聽 聽 聽 聽 <KeyInfo>
聽 聽 聽 聽 聽 聽 <X509Data>
聽 聽 聽 聽 聽 聽 聽 聽 <X509Certificate></X509Certificate>
聽 聽 聽 聽 聽 聽 </X509Data>
聽 聽 聽 聽 </KeyInfo>
聽 聽 </Signature>
#pragma __endtext
聽 cNewXml:="D:\Sistemas\NewFact.xml"
聽//6. Tomar la secci贸n de la firma y obtener un HASH del mismo aplicando el algoritmo SHA256.
聽cHash256:=HB_SHA256(cSignXml)
聽
聽 SSL_init()
聽 聽OpenSSL_add_all_ciphers()
聽 聽ctx := hb_EVP_CIPHER_ctx_create()
聽 聽EVP_CIPHER_CTX_init( ctx )
//7. Encriptar el HASH obtenido utilizando el algoritmo RSA SHA256 con la llave privada.
聽 聽EVP_EncryptInit( ctx, HB_EVP_MD_SHA256, cPrivateKey )
聽 聽EVP_EncryptUpdate( ctx, @encrypted, cHash256 )
//8.Aplicar a la cadena resultante el algoritmo Base64 para obtener una cadena. 聽
聽 聽cRsaSha256:=HB_Base64Encode(encrypted)
聽 聽?cRsaSha256
聽 聽Hb_MemoWrit(cNewXml,cRsaSha256) //Guarda el resultado
聽 聽EVP_cleanup()
Return Nil
//Devuelve 茅ste resultado
n/i+BrTtSV4glcaIxrlGDMNaoUmIH5sZjeKDRM4e9L7VVxBJQahKhA1C6TtFkPwS7Dhz/hqo/izhadVpCLRcpw== //de 88 caracteres y deben ser 344
//El resultado debe ser similar a 茅ste
O7mRo9J7olCzanqMpuUX9vyUMNWcbg7c8LOcUs2Uko48MVtXX1FU2bvSSWdR22u4ptqD8W2pRLIo
s8vtMcsUDWjaH8AY859TDDcN6SYe3g/H9xJIBG6nC/QmBTAarIi89Uc585zhsIOcnhVn5isB/Bmu
T/NLFOaByAY5GYcH0S59iAIttyBf3MetSNO8YUGziaGLQuKprs5jeOMNFdbnMiWSEStjAbmjDmTG
HFiknuW89f5LeRxfBCfRkzUUGk2KO1ILChJGCVwx0G5kS39JCrm+AJNG+EBC7lwulPP427UcNXOJ
X55wF6U1obMHcXlllNGe8/4oboaGUJSHJKj5Rg==
Quiz谩s alguien ya lo haya logrado.
He encontrado 茅ste c贸digo en Java y hay que convertirlo :(
import java.security.KeyFactory;
import java.security.Signature;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.Base64;
聽
public class SHA256RSA {
聽 聽 聽
聽 聽 public static void main(String[] args) throws Exception {
聽 聽 聽 聽 String input = "sample input";
聽 聽 聽 聽 聽
聽 聽 聽 聽 // Not a real private key! Replace with your private key!
聽 聽 聽 聽 String strPk = "-----BEGIN PRIVATE KEY-----\nMIIEvwIBADANBgkqhkiG9"
聽 聽 聽 聽 聽 聽 聽 聽 + "w0BAQEFAASCBKkwggSlAgEAAoIBAQDJUGqaRB11KjxQ\nKHDeG"
聽 聽 聽 聽 聽 聽 聽 聽 + "........................................................"
聽 聽 聽 聽 聽 聽 聽 聽 + "Ldt0hAPNl4QKYWCfJm\nNf7Afqaa/RZq0+y/36v83NGENQ==\n"
聽 聽 聽 聽 聽 聽 聽 聽 + "-----END PRIVATE KEY-----\n";
聽 聽 聽 聽 聽
聽 聽 聽 聽 String base64Signature = signSHA256RSA(input,strPk);
聽 聽 聽 聽 System.out.println("Signature="+base64Signature);
聽 聽 }
聽
聽 聽 // Create base64 encoded signature using SHA256/RSA.
聽 聽 private static String signSHA256RSA(String input, String strPk) throws Exception {
聽 聽 聽 聽 // Remove markers and new line characters in private key
聽 聽 聽 聽 String realPK = strPk.replaceAll("-----END PRIVATE KEY-----", "")
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽.replaceAll("-----BEGIN PRIVATE KEY-----", "")
聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽 聽.replaceAll("\n", "");
聽
聽 聽 聽 聽 byte[] b1 = Base64.getDecoder().decode(realPK);
聽 聽 聽 聽 PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(b1);
聽 聽 聽 聽 KeyFactory kf = KeyFactory.getInstance("RSA");
聽
聽 聽 聽 聽 Signature privateSignature = Signature.getInstance("SHA256withRSA");
聽 聽 聽 聽 privateSignature.initSign(kf.generatePrivate(spec));
聽 聽 聽 聽 privateSignature.update(input.getBytes("UTF-8"));
聽 聽 聽 聽 byte[] s = privateSignature.sign();
聽 聽 聽 聽 return Base64.getEncoder().encodeToString(s);
聽 聽 }
}
Gracias por la ayuda