Criptografia em SHA1

Boa tarde pessoal,

Estou trabalhando em um projeto de Nota Fiscal Eletronica - NFe da prefeitura de sao paulo, porem estou tendo problemas para fazer a assinatura de cancelamento. O retorno que recebo do site da prefeitura é: “Rejeição: a assinatura difere do calculado”, abaixo eu vou colocar o que é solicitado no tutorial da prefeitua e o codigo que fiz e se alguem ja fez esse tipo de trabalho e/ou tem alguma sugestão eu agradeço…

Tecnologias utilizadas : Hibernate, JSF, Axis (webservice). Banco de Dados mysql.

Solicitação da prefeitura para assinar a String com o xml:

31000000 9 ... Com base no trecho da mensagem XML apresentada, montamos a seguinte String de caracteres: "31000000000000000009" 2º - Converta a cadeia de caracteres ASCII para bytes. 3º - Gere o HASH (array de bytes) utilizando SHA1. 4º - Assine o HASH (array de bytes) utilizando RSA-SHA1. ATENÇÃO! Na maioria das linguagens de programação, os passos 3 e 4 são feitos através de uma única função. Verifique a documentação de sua linguagem para evitar assinar um hash de um hash.

Meu Codigo:

public static String assinar(String certificado, String senha, String textoParaAssinar) {

        String res = "";
        try {

            MessageDigest md = MessageDigest.getInstance("SHA-1");
            md.update(textoParaAssinar.getBytes());
            
            byte[] input = md.digest();
            
            Signature signer = Signature.getInstance("SHA1withRSA");
            signer.initSign(getPrivateKey(certificado, senha));
            signer.update(input);

          
          
           res = new BASE64Encoder().encode(signer.sign());
           


        } catch (SignatureException ex) {
            ex.printStackTrace();
            return null;
        } catch (InvalidKeyException ex) {
            ex.printStackTrace();
            return null;
        } catch (NoSuchAlgorithmException ex) {
            ex.printStackTrace();
            return null;
        }
        return res;
    }

Metodo q devolve a chave privada.

private static PrivateKey getPrivateKey(String certificado, String senha) {
        PrivateKey p = null;

        try {
            File file = new File("build\web\certificados");
            String path = file.getAbsolutePath() + "\" + certificado;
            //FileInputStream fis = new FileInputStream(NfeUtil.generatePathToSecurity(path));
            FileInputStream fis = new FileInputStream(path);
            KeyStore ks = KeyStore.getInstance("PKCS12");
            ks.load(fis, senha.toCharArray());
            Enumeration aliasesEnum = ks.aliases();

            String alias = "";
            while (aliasesEnum.hasMoreElements()) {
                alias = (String) aliasesEnum.nextElement();
                if (ks.isKeyEntry(alias)) {
                    break;
                }
            }

            KeyStore.PrivateKeyEntry keyEntry = (KeyStore.PrivateKeyEntry) ks.getEntry(alias,
                    new KeyStore.PasswordProtection(senha.toCharArray()));

            p = keyEntry.getPrivateKey();

        } catch (UnrecoverableEntryException ex) {
            ex.printStackTrace();
            return null;
        } catch (CertificateException ex) {
            ex.printStackTrace();
            return null;
        } catch (KeyStoreException ex) {
            ex.printStackTrace();
            return null;
        } catch (NoSuchAlgorithmException ex) {
            ex.printStackTrace();
            return null;
        } catch (IOException ex) {
            ex.printStackTrace();
            return null;
        }
        return p;
    }

Obrigado desde ja
Elton C.

Alguem ?

Obrigado
Elton C.