C# – 89 77 characters
string I(string s){return s+(9992-s.Sum(x=>x-0)-2*s.Where((x,i)=>i%2>0).Sum(x=>x-0))%10;}
Formatted for readability:
string I(string s)
{
return s +
(9992
- s.Sum(x => x - 0)
- 2 * s.Where((x, i) => i%2 > 0).Sum(x => x - 0)
) % 10;
}
We do not multiply by one or three, we just add everything, plus we add all even-placed characters one more time, multiplied by two.
9992 is large enough so that the sum of all ASCII characters is less than that (so that we may mod by 10 and be sure the result is positive, no need to mod by 10 twice), and is not divisible by zero because we add up all those extra 2*12*48 (twelve ASCII digits, weighed by 1 and 3) == 1152, which allows us to spare one extra character (instead of twice subtracting 48, we subtract 0 just to convert from char to int, but instead of 990, we need to write 9992).
But then again, even though much less beautiful ;-), this old-school solution gets us to 80 characters (but this is almost C-compatible):
string T(string i){int s=2,j=0;for(;j<12;)s+=i[j]*(9-j++%2*2);return i+s%10;}