Ho trovato questo link molto interessate con il dettaglio della composizione dei codici IBAN.
In particolare è interessante il meccanismo di calcolo del codice di controllo CIN che riporto qui:
Nel corso del calcolo si usano le due seguenti successioni numeriche:Successione per le posizioni dispari: 1,0,5,7,9,13,15,17,19,21,2,4,18,20,11,3,6,8,12,14,16,10,22,25,24,23,27,28,26Successione per le posizioni pari: 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28
Si parte dalla stringa di 22 caratteri ottenuta accostando ABI, CAB e conto corrente:
Scorrendo questa stringa da sinistra a destra, ogni carattere occupa in essa una posizione che è considerata dispari (caratteri primo, terzo, quinto, eccetera) oppure pari (caratteri secondo, quarto, sesto, eccetera). A ciascun carattere si attribuisce un peso, ricavato dall’una o dall’altra successione in base al criterio di parità, e tutti questi pesi vengono sommati.
Conviene chiarire il procedimento con un esempio.
Si prende il primo carattere, che di solito è numerico, ma in teoria potrebbe essere alfabetico. Se il carattere è 0 oppure A, gli si assegna come peso 1 (primo elemento della successione per le posizioni dispari), se è 1 oppure B gli si assegna il peso 0 (secondo elemento), se è 2 oppure C il peso 5 (terzo elemento) e così via.
Ciò fatto, si passa al secondo carattere della stringa e qui entra in gioco la successione per le posizioni pari. Quindi si assegna il peso 0 se il carattere è0 oppure A, il peso 1 se è 1 oppure B, il peso 2 se è 2 oppure C, eccetera.
Passando al terzo carattere si riprende la successione per le posizioni dispari e si procede fino a esaurire tutti i caratteri della stringa, alternando l’uso delle due successioni.
I pesi via via ottenuti vengono sommati e il risultato di questa somma viene diviso per 26, prendendo il resto di tale divisione.
In conclusione, il codice CIN è il carattere alfabetico che ha la posizione corrispondente a tale resto, cominciando a contare da 0, vale a dire A corrisponde a 0, B corrisponde a 1, C corrisponde a 2 e così via fino a Z che corrisponde a 25.
Calcolo del codice di controllo CIN in IBAN con Python
Ho fatto questa breve implementazione in Python che si può utilizzare in diverse modalità:
Questa, predefinita, prevede vengano passati da linea di comando, come argomenti, il codice Abi, Cab e il conto corrente.
# encoding: utf-8 import sys def CalcolaCin(abi, cab, cc): checkiban = str(abi) + str(cab) + str(cc) alfa = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"] posdis = [1,0,5,7,9,13,15,17,19,21,2,4,18,20,11,3,6,8,12,14,16,10,22,25,24,23,27,28,26] pospar = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28] ri = 0 cr = 0 cs = 0 resto = 0 i = 0 for p in checkiban: i = i +1 if p.isdigit(): #se numerico if i % 2 == 1: # dispari #print "-->POSIZIONE PARI: %s VAL:%s" % (i,str(p)) cs = cs + posdis[int(p)] #print "RISULTATO:%s\n" % (str(posdis[int(p)])) if i % 2 == 0: # pari #print "-->POSIZIONE DISPARI: %s VAL:%s" % (i,str(p)) cs = cs + pospar[int(p)] #print "RISULTATO:%s\n" %(str(pospar[int(p)])) else: # se alfanumerico if i % 2 == 1: # dispari #print "-->POSIZIONE PARI: %s VAL:%s" % (i,str(p)) cs = cs + posdis[int(alfa.index(p))] #print "RISULTATO:%s\n" % (str(posdis[int(p)])) if i % 2 == 0: # pari #print "-->POSIZIONE DISPARI: %s VAL:%s" % (i,str(p)) cs = cs + pospar[int(alfa.index(p))] #print "CHECKSUM: %s" % cs ri = cs /26 #print "RISULTATO INTERO: %s" % ri cr = 26 * ri resto = cs - cr #print "RESTO: %s" % resto print "IL TUO CODICE CIN: %s" % alfa[resto] #abi = raw_input("Inserire il codice ABI:") #cab = raw_input("Inserire il codice CAB:") #cc = raw_input("Inserire il numero di conto corrente:") #CalcolaCin(abi,cab,cc) CalcolaCin(sys.argv[1],sys.argv[2],sys.argv[3])
Ho commentato le parti di debug, che possono essere utili per la verifica della procedura, e la parte di input diretto che può essere usata per richiedere un input esplicito all’utente, in questo caso si possono modificare le ultime righe in questo modo:
abi = raw_input("Inserire il codice ABI:") cab = raw_input("Inserire il codice CAB:") cc = raw_input("Inserire il numero di conto corrente:") CalcolaCin(abi,cab,cc) #CalcolaCin(sys.argv[1],sys.argv[2],sys.argv[3])