Calcul insc / ins-c

Description

Calcul de l'INS-C sensé remplacer notre Numéro de Sécurité Sociale (aussi appelé Numéro INSEE).

Ce code a été conçu d'après la doc de l'ASIP Santé, document révisé du 30/10/2009.
Voici une page avec quelques informations :
http://esante.gouv.fr/referentiels/identification/ins-faq
                • UTILISATION ********

Dim sINSC as String
sINSC = CalculINSC("150081505104018", "Jean", #01/08/1950#)
' sINSC = 1541187387477485562488
                • VERIFICATION *********

Vous pouvez vérifier le bon fonctionnement de ce code sur ce site :
http://www.coweb.fr/ins-c/
ATTENTION : l'année de la date y est sur 2 chiffres !
A noter aussi qu'il ne semble pas correctement fonctionner avec tous les caractères accentués dans le prénom, le navigateur ayant peut-être un rôle à jouer dans ce problème...

Source / Exemple :


Imports System.Text
Imports System.Security.Cryptography

Module ModuleINSC
    Public Function SHA256_Encrypt(Txt As String) As String

        Dim sha As New SHA256Managed()
        Dim ae As New ASCIIEncoding()
        Dim Hash() As Byte = sha.ComputeHash(ae.GetBytes(Txt))
        Dim sb As New StringBuilder(Hash.Length * 2)
        Dim ndx As Integer

        For ndx = 0 To Hash.Length - 1
            sb.Append(Right("0" & Hex(Hash(ndx)), 2))
        Next
        Return sb.ToString

    End Function

    Public Function CalculINSC(ByVal sNIR As String, ByVal sPrenoms As String, ByVal dNaissance As Date) As String
        Dim sNIRsansCle As String
        Dim sPrenomsNormalises As String
        Dim sNaissance As String
        Dim sGraine As String
        Dim sGraineHachee As String

        Dim sTemp As String

        CalculINSC = ""

        ' Normalisation des prénoms
        sPrenomsNormalises = sPrenoms
        sPrenomsNormalises = Trim(sPrenomsNormalises).Replace(" ", "")
        sPrenomsNormalises = sPrenomsNormalises.PadRight(10).Substring(0, 10) '(sPrenomsNormalises & Space(10)).Substring(0, 10)
        sTemp = ""
        For Each car In sPrenomsNormalises
            Select Case car
                Case "À"c, "Á"c, "Â"c, "Ã"c, "Ä"c, "Å"c, "Æ"c, "à"c, "á"c, "â"c, "ã"c, "æ"c, "ä"c, "å"c
                    sTemp = sTemp & "A"
                Case "È"c, "É"c, "Ê"c, "Ë"c, "è"c, "é"c, "ê"c, "ë"c
                    sTemp = sTemp & "E"
                Case "Ð"c, "ð"c
                    sTemp = sTemp & "D"
                Case "Ò"c, "Ó"c, "Ô"c, "Õ"c, "Ö"c, "Ø"c, "ò"c, "ó"c, "ô"c, "õ"c, "ö"c, "ø"c
                    sTemp = sTemp & "O"
                Case "Ý"c, "ý"c, "ÿ"c, "Ÿ"c
                    sTemp = sTemp & "Y"
                Case "Ç"c, "ç"c
                    sTemp = sTemp & "C"
                Case "Ì"c, "Í"c, "Î"c, "Ï"c, "ì"c, "í"c, "î"c, "ï"c
                    sTemp = sTemp & "I"
                Case "Ñ"c, "ñ"c
                    sTemp = sTemp & "N"
                Case "Ù"c, "Ú"c, "Û"c, "Ü"c, "ù"c, "ú"c, "û"c, "ü"c
                    sTemp = sTemp & "U"
                Case "ß"c
                    sTemp = sTemp & "B"
                Case "Š"c, "š"c
                    sTemp = sTemp & "S"
                Case "Ţ"c, "ţ"c
                    sTemp = sTemp & "Z"
                Case Else
                    sTemp = sTemp & car
            End Select
        Next
        sPrenomsNormalises = sTemp.ToUpper
        sTemp = ""
        For Each car In sPrenomsNormalises
            If Asc(car) < 65 Or Asc(car) > 91 Then
                sTemp = sTemp & " "
            Else
                sTemp = sTemp & car
            End If
        Next
        sPrenomsNormalises = sTemp

        ' Normalisation de la date de naissance
        sNaissance = (dNaissance.Year.ToString.Substring(2).ToString.PadRight(2) & dNaissance.Month.ToString.PadLeft(2) & dNaissance.Day.ToString.PadLeft(2)).Replace(" ", "0")

        ' Normalisation du NIR
        sNIRsansCle = sNIR.Substring(0, 13)

        ' Concaténation
        sGraine = sPrenomsNormalises & sNaissance & sNIRsansCle

        ' Hashage
        sGraineHachee = SHA256_Encrypt(sGraine)

        ' Conversion de l&#8217;empreinte SHA256 en format numérique (chiffres de 0 à 9).
        ' Les 64 bits de poids fort de l&#8217;empreinte sont convertis en base 10 afin d&#8217;obtenir une chaine composée de 20 chiffres.
        ' Si le nombre obtenu s&#8217;exprime sur moins de 20 chiffres, il est complété à gauche par des zéros.
        sGraineHachee = sGraineHachee.Substring(0, 16)
        Dim iINS As ULong = ULong.Parse(sGraineHachee, System.Globalization.NumberStyles.HexNumber)
        Dim iCle As Integer = System.Convert.ToInt16(97 - (iINS Mod 97))
        CalculINSC = (iINS.ToString & iCle.ToString).PadLeft(22).Replace(" ", "0")
    End Function

End Module

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.