7
votes

Comment obtenir le nom de hachage d'algorithme à l'aide de l'OID en Java?

J'essaie de calculer le hachage d'un tableau d'octets en Java. Pour obtenir une instance de messageDigest, j'ai besoin d'informer le nom de hachage, mais je n'ai que le hash OID. Y a-t-il une autre façon de faire cela ou d'une carte existante de Hash Oid aux noms de hachage? XXX


2 commentaires

Quel genre d'OID est-ce? ASN.1? Quel responsable de ces OID?


C'est un OID ASN.1. Ces OID sont les normalisées.


3 Réponses :


2
votes

J'ai trouvé une réponse. La classe org.bouncycastle.cms.cmsignedhelper de Bibliothèque de château Bouncy a la cartographie. J'ai extrait l'extrait requis de là et copié ici.

...
private static final Map     encryptionAlgs = new HashMap();
private static final Map     digestAlgs = new HashMap();

static
{
    encryptionAlgs.put(X9ObjectIdentifiers.id_dsa_with_sha1.getId(), "DSA");
    encryptionAlgs.put(X9ObjectIdentifiers.id_dsa.getId(), "DSA");
    encryptionAlgs.put(OIWObjectIdentifiers.dsaWithSHA1.getId(), "DSA");
    encryptionAlgs.put(PKCSObjectIdentifiers.rsaEncryption.getId(), "RSA");
    encryptionAlgs.put(PKCSObjectIdentifiers.sha1WithRSAEncryption.getId(), "RSA");
    encryptionAlgs.put(TeleTrusTObjectIdentifiers.teleTrusTRSAsignatureAlgorithm, "RSA");
    encryptionAlgs.put(X509ObjectIdentifiers.id_ea_rsa.getId(), "RSA");
    encryptionAlgs.put(CMSSignedDataGenerator.ENCRYPTION_ECDSA, "ECDSA");
    encryptionAlgs.put(X9ObjectIdentifiers.ecdsa_with_SHA2.getId(), "ECDSA");
    encryptionAlgs.put(X9ObjectIdentifiers.ecdsa_with_SHA224.getId(), "ECDSA");
    encryptionAlgs.put(X9ObjectIdentifiers.ecdsa_with_SHA256.getId(), "ECDSA");
    encryptionAlgs.put(X9ObjectIdentifiers.ecdsa_with_SHA384.getId(), "ECDSA");
    encryptionAlgs.put(X9ObjectIdentifiers.ecdsa_with_SHA512.getId(), "ECDSA");
    encryptionAlgs.put(CMSSignedDataGenerator.ENCRYPTION_RSA_PSS, "RSAandMGF1");
    encryptionAlgs.put(CryptoProObjectIdentifiers.gostR3410_94.getId(), "GOST3410");
    encryptionAlgs.put(CryptoProObjectIdentifiers.gostR3410_2001.getId(), "ECGOST3410");
    encryptionAlgs.put("1.3.6.1.4.1.5849.1.6.2", "ECGOST3410");
    encryptionAlgs.put("1.3.6.1.4.1.5849.1.1.5", "GOST3410");

    digestAlgs.put(PKCSObjectIdentifiers.md5.getId(), "MD5");
    digestAlgs.put(OIWObjectIdentifiers.idSHA1.getId(), "SHA1");
    digestAlgs.put(NISTObjectIdentifiers.id_sha224.getId(), "SHA224");
    digestAlgs.put(NISTObjectIdentifiers.id_sha256.getId(), "SHA256");
    digestAlgs.put(NISTObjectIdentifiers.id_sha384.getId(), "SHA384");
    digestAlgs.put(NISTObjectIdentifiers.id_sha512.getId(), "SHA512");
    digestAlgs.put(PKCSObjectIdentifiers.sha1WithRSAEncryption.getId(), "SHA1");
    digestAlgs.put(PKCSObjectIdentifiers.sha224WithRSAEncryption.getId(), "SHA224");
    digestAlgs.put(PKCSObjectIdentifiers.sha256WithRSAEncryption.getId(), "SHA256");
    digestAlgs.put(PKCSObjectIdentifiers.sha384WithRSAEncryption.getId(), "SHA384");
    digestAlgs.put(PKCSObjectIdentifiers.sha512WithRSAEncryption.getId(), "SHA512");
    digestAlgs.put(TeleTrusTObjectIdentifiers.ripemd128.getId(), "RIPEMD128");
    digestAlgs.put(TeleTrusTObjectIdentifiers.ripemd160.getId(), "RIPEMD160");
    digestAlgs.put(TeleTrusTObjectIdentifiers.ripemd256.getId(), "RIPEMD256");
    digestAlgs.put(CryptoProObjectIdentifiers.gostR3411.getId(),  "GOST3411");
    digestAlgs.put("1.3.6.1.4.1.5849.1.2.1",  "GOST3411");
}

String getDigestAlgName(String digestAlgOID) {
    String algName = (String)digestAlgs.get(digestAlgOID);

    if (algName != null)
    {
        return algName;
    }

    return digestAlgOID;
}

String getEncryptionAlgName(String encryptionAlgOID) {
    String algName = (String)encryptionAlgs.get(encryptionAlgOID);

    if (algName != null)
    {
        return algName;
    }

    return encryptionAlgOID;
}

MessageDigest getDigestInstance(String algorithm, String provider) 
    throws NoSuchProviderException, NoSuchAlgorithmException {
    if (provider != null)
    {
        try
        {
            return MessageDigest.getInstance(algorithm, provider);
        }
        catch (NoSuchAlgorithmException e)
        {
            return MessageDigest.getInstance(algorithm); // try rolling back
        }
    }
    else
    {
        return MessageDigest.getInstance(algorithm);
    }
}


0 commentaires

1
votes

La classe org.bouncycastle.cms.cmssignedGenerator a des constantes pour chacun de ses algorithmes supportés. Ses constantes sont publiques, elles sont donc plus faciles à utiliser que CMSsigneDhelper accessible uniquement.


0 commentaires

4
votes

La plupart des fournisseurs de sécurité (et Bouncycastle sont l'un d'entre eux) définit non seulement un nom d'algorithme unique, mais également des alias, qui incluent OID. Ainsi, il est possible de passer OID directement à JCA comme ceci: xxx

digestalgorithmname sera égal à SHA-1 à la fin. Cela ne fonctionne pas avec le fournisseur Sun Security.


3 commentaires

Malheureusement, bien que JCE prend également en charge des alias d'OID (au moins en 1.8), getalgorithm () retournerait l'OID :)


Oui, le fournisseur de soleil a également reçu des alias spécifiés pour les algorithmes, mais cela ne résout pas le nom d'algorithme correctement. Donc, maintenant, il est nécessaire d'utiliser le nom explicite du fournisseur de sécurité pour obtenir la mise en œuvre de Bouncycastle du MessageDigest .


Pour Bouncycastle, j'ai utilisé: BCMessageDigest.getinstance (Signer.getDigestalgoid (), "BC"). Getalgorithm ();